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

Artifact 7e924eac52ccec527caab00f8cd2c568ddec4b25:


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 4e 4f 54 5f 46 55  ine WHERE_NOT_FU
2820: 4c 4c 53 43 41 4e 20 30 78 30 30 30 66 33 30 30  LLSCAN 0x000f300
2830: 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64  0  /* Does not d
2840: 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  o a full table s
2850: 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  can */.#define W
2860: 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20  HERE_IN_ABLE    
2870: 20 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a    0x000f1000  /*
2880: 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74   Able to support
2890: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
28a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
28b0: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
28c0: 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45  00100000  /* x<E
28d0: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
28e0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
28f0: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
2900: 49 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30  IMIT    0x002000
2910: 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  00  /* x>EXPR or
2920: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
2930: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
2940: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
2950: 20 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a    0x00800000  /*
2960: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
2970: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
2980: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
2990: 44 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30  DERBY      0x010
29a0: 30 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74  00000  /* Output
29b0: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
29c0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
29d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
29e0: 45 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32  EVERSE      0x02
29f0: 30 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20  000000  /* Scan 
2a00: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
2a10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2a20: 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30  E_UNIQUE       0
2a30: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65  x04000000  /* Se
2a40: 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68  lects no more th
2a50: 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64  an one row */.#d
2a60: 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54  efine WHERE_VIRT
2a70: 55 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30  UALTABLE 0x08000
2a80: 30 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74  000  /* Use virt
2a90: 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73  ual-table proces
2aa0: 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  sing */.#define 
2ab0: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
2ac0: 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f     0x10000000  /
2ad0: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
2ae0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
2af0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d  define WHERE_TEM
2b00: 50 5f 49 4e 44 45 58 20 20 20 30 78 32 30 30 30  P_INDEX   0x2000
2b10: 30 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  0000  /* Uses an
2b20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2b30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
2b40: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
2b50: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
2b60: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2b70: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2b80: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
2b90: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
2bb0: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
2bc0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2bd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bf0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2c00: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2c10: 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f  et *pMaskSet   /
2c20: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
2c30: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
2c40: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
2c50: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
2c60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2c70: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
2c80: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
2c90: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
2ca0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
2cb0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
2cc0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
2cd0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
2ce0: 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d  WC->vmask = 0;.}
2cf0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2d00: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2d10: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2d20: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2d30: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2d40: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2d50: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2d60: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2d70: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2d80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2d90: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2da0: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2db0: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2dc0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2dd0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2de0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2df0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2e00: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2e10: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2e20: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e40: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2e50: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2e60: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2e70: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2e80: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2e90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2ea0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2eb0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2ec0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2ed0: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2ee0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2ef0: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2f00: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2f10: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2f20: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2f30: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2f40: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2f50: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2f60: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2f70: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2f80: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2f90: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2fa0: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2fb0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2fc0: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2fd0: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2fe0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2ff0: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
3000: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3010: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
3020: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
3030: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
3040: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
3050: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
3060: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3070: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
3080: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
3090: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
30a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
30b0: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
30c0: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
30d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30e0: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
30f0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
3100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3110: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
3120: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
3130: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3140: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
3150: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3160: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
3170: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
3180: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3190: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
31a0: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
31b0: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
31c0: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
31d0: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
31e0: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
31f0: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
3200: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
3210: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
3220: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
3230: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
3240: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3250: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
3260: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
3270: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
3280: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
32a0: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
32b0: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
32c0: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
32d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32e0: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
32f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3300: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
3310: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
3320: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
3330: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
3340: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
3350: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
3360: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
3370: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
3380: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3390: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
33a0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
33b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
33c0: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
33d0: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
33e0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
33f0: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
3400: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
3410: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
3420: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
3430: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
3440: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
3450: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
3460: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
3470: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
3480: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
34a0: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
34b0: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
34c0: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
34d0: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
34e0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
34f0: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
3500: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
3510: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3520: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
3530: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3540: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
3550: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
3560: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3570: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3580: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
35a0: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
35b0: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
35c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
35d0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
35e0: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
35f0: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3600: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
3610: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
3620: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
3630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3640: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
3650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3660: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3670: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3680: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3690: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
36a0: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
36b0: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
36c0: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
36d0: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
36e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
36f0: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3700: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
3710: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3720: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
3730: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
3740: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
3750: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
3760: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3770: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3780: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3790: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
37a0: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
37b0: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
37c0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
37d0: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
37e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
37f0: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3800: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
3810: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
3820: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
3830: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
3840: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
3850: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
3860: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3870: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3880: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3890: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
38a0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
38b0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
38c0: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
38d0: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
38e0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
38f0: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3900: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3910: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3920: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
3930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
3940: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3950: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3960: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3970: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3980: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3990: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
39b0: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
39c0: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
39d0: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
39e0: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
39f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3a00: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3a10: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3a20: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
3a30: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
3a40: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
3a50: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3a60: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3a70: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3a80: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3a90: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3aa0: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3ab0: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3ac0: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3ad0: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3ae0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3af0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3b00: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3b10: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3b20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3b30: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3b40: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3b50: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3b60: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3b70: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3b80: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3b90: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3ba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3bb0: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3bc0: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3bd0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3be0: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3bf0: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3c00: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3c10: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3c20: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3c30: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3c40: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3c50: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3c60: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3c70: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3c80: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3c90: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3ca0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3cb0: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3cc0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3cd0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3ce0: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3cf0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3d00: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3d10: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3d20: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3d30: 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ->n<=sizeof(Bitm
3d40: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
3d50: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
3d60: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
3d70: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
3d80: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
3d90: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
3da0: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
3db0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
3dd0: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
3de0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
3df0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
3e00: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
3e10: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
3e20: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
3e30: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
3e40: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3e50: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
3e60: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
3e70: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
3e80: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
3e90: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
3ea0: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
3eb0: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
3ec0: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
3ed0: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
3ee0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
3ef0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
3f00: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
3f10: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
3f20: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
3f30: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
3f40: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
3f50: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
3f60: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
3f70: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
3f80: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
3f90: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
3fa0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3fb0: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
3fc0: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
3fd0: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
3fe0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
3ff0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4000: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
4010: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
4020: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
4030: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4040: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4050: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4060: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4070: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4080: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4090: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
40a0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
40b0: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
40c0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
40d0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
40e0: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
40f0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4100: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4110: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4120: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
4130: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4140: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4150: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4160: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4170: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4180: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4190: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
41a0: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
41b0: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
41c0: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
41d0: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
41e0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
41f0: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4200: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4210: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4220: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4230: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4240: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4250: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4260: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4270: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4280: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4290: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
42a0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
42b0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
42c0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
42d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
42e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
42f0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4300: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4310: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4320: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
4330: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4340: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4350: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4360: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4370: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4380: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4390: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
43a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
43b0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
43c0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
43d0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
43e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
43f0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4410: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4420: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4430: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4440: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4450: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4460: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4470: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4480: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4490: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
44a0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
44b0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
44c0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
44d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
44e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
44f0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4500: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4510: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4520: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
4530: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4540: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4550: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4560: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4570: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4580: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4590: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
45a0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
45b0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
45c0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
45d0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
45e0: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
45f0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4600: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4610: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
4620: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
4630: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
4640: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
4650: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
4660: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4670: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4680: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
4690: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
46a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
46b0: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70  >pHaving);.    p
46c0: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
46d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
46e0: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
46f0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
4700: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
4710: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
4720: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
4730: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
4740: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
4750: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
4760: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
4770: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
4780: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
4790: 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a  ">=", and "IN"..
47a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
47b0: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
47c0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
47d0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
47e0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
47f0: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
4800: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
4810: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
4820: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
4830: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
4840: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
4850: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
4860: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
4870: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
4880: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
4890: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
48a0: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
48b0: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
48c0: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
48d0: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
48e0: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
48f0: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
4900: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
4910: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
4920: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
4930: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
4940: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
4950: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  p X"..**.** If a
4960: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
4970: 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65  nce is associate
4980: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68  d with either th
4990: 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a  e left or right.
49a0: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
49b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
49c0: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
49d0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
49e0: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
49f0: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
4a00: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
4a10: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
4a20: 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20   .** "X collate 
4a30: 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68  NOCASE op Y". Th
4a40: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
4a50: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
4a60: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
4a70: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
4a80: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
4a90: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
4aa0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
4ab0: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
4ac0: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
4ad0: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
4ae0: 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  e EP_ExpCollate 
4af0: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
4b00: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
4b10: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
4b20: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
4b30: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
4b40: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
4b50: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4b60: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
4b70: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
4b80: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
4b90: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
4ba0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4bb0: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4bc0: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
4bd0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
4be0: 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e  _IN );.  pExpr->
4bf0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20  pRight->pColl = 
4c00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4c10: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4c20: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
4c30: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
4c40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4c50: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
4c60: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53  xpr->pLeft);.  S
4c70: 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78  WAP(CollSeq*,pEx
4c80: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
4c90: 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l,pExpr->pLeft->
4ca0: 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d  pColl);.  pExpr-
4cb0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d  >pRight->flags =
4cc0: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
4cd0: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
4ce0: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65  Collate) | expLe
4cf0: 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  ft;.  pExpr->pLe
4d00: 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ft->flags = (pEx
4d10: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4d20: 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74   & ~EP_ExpCollat
4d30: 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20  e) | expRight;. 
4d40: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
4d50: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
4d60: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4d70: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
4d80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
4d90: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
4db0: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
4dc0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
4dd0: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
4de0: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
4df0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
4e00: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
4e10: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
4e20: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
4e30: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
4e40: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
4e50: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
4e60: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
4e70: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
4e80: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
4e90: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
4ea0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
4eb0: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
4ec0: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
4ed0: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
4ee0: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
4ef0: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
4f00: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
4f10: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
4f20: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
4f30: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4f40: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
4f50: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
4f60: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
4f70: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
4f80: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
4f90: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
4fa0: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
4fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4fc0: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
4fd0: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
4fe0: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
4ff0: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
5000: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
5010: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
5020: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
5030: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
5040: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5050: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
5060: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5070: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
5080: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
5090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
50a0: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
50b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
50c0: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
50d0: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
50e0: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
50f0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
5100: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
5110: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
5120: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
5130: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
5140: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
5150: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
5160: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
5170: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
5180: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
5190: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
51b0: 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28  eTerm *findTerm(
51c0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
51d0: 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
51e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
51f0: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5200: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
5210: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
5220: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
5230: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
5240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
5250: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  umn number of LH
5260: 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  S */.  Bitmask n
5270: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
5280: 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65  RHS must not ove
5290: 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d  rlap with this m
52a0: 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c  ask */.  u32 op,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52c0: 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20  * Mask of WO_xx 
52d0: 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e  values describin
52e0: 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  g operator */.  
52f0: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
5300: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
5310: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
5320: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
5330: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
5340: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
5350: 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73  m;.  int k;.  as
5360: 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b  sert( iCur>=0 );
5370: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b  .  op &= WO_ALL;
5380: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5390: 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
53a0: 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  m; k; k--, pTerm
53b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
53c0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
53d0: 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28  iCur.       && (
53e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
53f0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
5400: 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72  0.       && pTer
5410: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
5420: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
5430: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
5440: 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20  ator & op)!=0.  
5450: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
5460: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
5470: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
5480: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  LL ){.        Ex
5490: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
54a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43  pExpr;.        C
54b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
54c0: 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
54d0: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ff;.        int 
54e0: 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73 65  j;.        Parse
54f0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
5500: 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20  pParse;..       
5510: 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e   idxaff = pIdx->
5520: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
5530: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
5540: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
5550: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
5560: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
5570: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
5580: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
5590: 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ut the collation
55a0: 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72   sequence requir
55b0: 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78  ed from an index
55c0: 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
55d0: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
55e0: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
55f0: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
5600: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
5610: 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72   ** value in var
5620: 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20  iable pColl..   
5630: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
5640: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
5650: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
5660: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
5670: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
5680: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
5690: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
56a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
56b0: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
56c0: 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66  Err);..        f
56d0: 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69  or(j=0; pIdx->ai
56e0: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
56f0: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
5700: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
5710: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  =pIdx->nColumn) 
5720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
5730: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
5740: 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74  ( pColl && sqlit
5750: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
5760: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
5770: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
5780: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5790: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
57a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
57b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
57c0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
57d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
57e0: 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73  prAnalyze(SrcLis
57f0: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
5800: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
5810: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
5820: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
5830: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
5840: 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69   .**.**.*/.stati
5850: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
5860: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
5870: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
5880: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
5890: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
58a0: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
58b0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
58c0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
58d0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
58e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
58f0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
5900: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
5910: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
5920: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
5930: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5940: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
5950: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
5960: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5970: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
5980: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
5990: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
59a0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
59b0: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
59c0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
59d0: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
59e0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
59f0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
5a00: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
5a10: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
5a20: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
5a30: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
5a40: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
5a50: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
5a60: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
5a70: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
5a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
5a90: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
5aa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5ab0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5ac0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ad0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
5ae0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
5af0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
5b00: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
5b10: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
5b20: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
5b30: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
5b40: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
5b50: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
5b60: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
5b70: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
5b80: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
5b90: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
5ba0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
5bb0: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
5bc0: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
5bd0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
5be0: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
5bf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
5c00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5c10: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
5c20: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5c30: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
5c40: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
5c50: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
5c60: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
5c70: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5c80: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
5c90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5ca0: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
5cb0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
5cc0: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
5cf0: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
5d00: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
5d10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5d20: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
5d30: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
5d40: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
5d50: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
5d60: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
5d70: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5d80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
5d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5da0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5db0: 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73 71   for LHS */.  sq
5dc0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5dd0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5de0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5df0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5e00: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5e10: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5e30: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5e40: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5e50: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
5e60: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
5e70: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
5e80: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
5e90: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
5ea0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
5eb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5ec0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5ed0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5ee0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5ef0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5f00: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5f10: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
5f20: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
5f30: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
5f40: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
5f50: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
5f60: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
5f70: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
5f80: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
5f90: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
5fa0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5fb0: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
5fc0: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
5fd0: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
5fe0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
5ff0: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
6000: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
6010: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
6020: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 20  as AFF_TEXT */. 
6030: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
6040: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
6050: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
6060: 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
6070: 75 72 6e 20 30 3b 20 20 2f 2a 20 48 61 70 70 65  urn 0;  /* Happe
6080: 6e 73 20 77 68 65 6e 20 4c 48 53 20 68 61 73 20  ns when LHS has 
6090: 61 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  an undefined col
60a0: 6c 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  lation */.  if( 
60b0: 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51  (pColl->type!=SQ
60c0: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
60d0: 20 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26   || *pnoCase) &&
60e0: 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74  .      (pColl->t
60f0: 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c  ype!=SQLITE_COLL
6100: 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f  _NOCASE || !*pno
6110: 43 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Case) ){.    /* 
6120: 49 4d 50 3a 20 52 2d 30 39 30 30 33 2d 33 32 30  IMP: R-09003-320
6130: 34 36 20 46 6f 72 20 74 68 65 20 47 4c 4f 42 20  46 For the GLOB 
6140: 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 20 63 6f  operator, the co
6150: 6c 75 6d 6e 20 6d 75 73 74 20 75 73 65 20 74 68  lumn must use th
6160: 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
6170: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e   BINARY collatin
6180: 67 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20  g sequence..    
6190: 2a 2a 20 49 4d 50 3a 20 52 2d 34 31 34 30 38 2d  ** IMP: R-41408-
61a0: 32 38 33 30 36 20 46 6f 72 20 74 68 65 20 4c 49  28306 For the LI
61b0: 4b 45 20 6f 70 65 72 61 74 6f 72 2c 20 69 66 20  KE operator, if 
61c0: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
61d0: 69 6b 65 20 6d 6f 64 65 0a 20 20 20 20 2a 2a 20  ike mode.    ** 
61e0: 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20  is enabled then 
61f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 75 73 74 20  the column must 
6200: 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  use the default 
6210: 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67  BINARY collating
6220: 0a 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  .    ** sequence
6230: 2c 20 6f 72 20 69 66 20 63 61 73 65 5f 73 65 6e  , or if case_sen
6240: 73 69 74 69 76 65 5f 6c 69 6b 65 20 6d 6f 64 65  sitive_like mode
6250: 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65   is disabled the
6260: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  n the column.   
6270: 20 2a 2a 20 6d 75 73 74 20 75 73 65 20 74 68 65   ** must use the
6280: 20 62 75 69 6c 74 2d 69 6e 20 4e 4f 43 41 53 45   built-in NOCASE
6290: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
62a0: 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nce..    */.    
62b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
62c0: 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d   pRight = pList-
62d0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f  >a[0].pExpr;.  o
62e0: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
62f0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
6300: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20  ISTER ){.    op 
6310: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20  = pRight->op2;. 
6320: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
6330: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
6340: 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65  Vdbe *pReprepare
6350: 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72   = pParse->pRepr
6360: 65 70 61 72 65 3b 0a 20 20 20 20 70 56 61 6c 20  epare;.    pVal 
6370: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
6380: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
6390: 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d  , pRight->iColum
63a0: 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
63b0: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
63c0: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
63d0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
63e0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
63f0: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
6400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6410: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
6420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6430: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
6440: 2d 3e 70 56 64 62 65 2c 20 70 52 69 67 68 74 2d  ->pVdbe, pRight-
6450: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 61  >iColumn);.    a
6460: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
6470: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
6480: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
6490: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
64a0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
64b0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
64c0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
64d0: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
64e0: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
64f0: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
6500: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
6510: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
6520: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
6530: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
6540: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
6550: 30 20 26 26 20 63 21 3d 30 20 26 26 20 32 35 35  0 && c!=0 && 255
6560: 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29  !=(u8)z[cnt-1] )
6570: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 50  {.      Expr *pP
6580: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69  refix;.      *pi
6590: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e  sComplete = z[cn
65a0: 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63  t]==wc[0] && z[c
65b0: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
65c0: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
65d0: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
65e0: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
65f0: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
6600: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
6610: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
6620: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
6630: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
6640: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
6650: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
6660: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6670: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6680: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6690: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
66a0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mn);.        if(
66b0: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
66c0: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
66d0: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
66e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
66f0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
6700: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
6710: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
6720: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
6730: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
6740: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
6750: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
6760: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
6770: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
6780: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
6790: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
67a0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
67b0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
67c0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
67d0: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
67e0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
67f0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
6800: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
6810: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
6820: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
6830: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
6840: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
6850: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
6860: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6870: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6880: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
6890: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
68a0: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
68b0: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
68c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68d0: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
68e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
68f0: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
6900: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6910: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6920: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
6930: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
6940: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6960: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
6970: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
6980: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
6990: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
69a0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
69b0: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
69c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
69d0: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
69e0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
69f0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6a00: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6a10: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6a20: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
6a30: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
6a40: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
6a50: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
6a60: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
6a70: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
6a80: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
6a90: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6aa0: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6ab0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6ac0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6ad0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6ae0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6af0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6b00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6b10: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
6b20: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
6b30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6b40: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
6b50: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
6b60: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
6b70: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
6b80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6b90: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6ba0: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
6bb0: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
6bc0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6bd0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
6be0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6bf0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
6c00: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
6c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
6c20: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
6c30: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6c40: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
6c50: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
6c60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
6c70: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
6c80: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
6c90: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
6ca0: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
6cb0: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
6cc0: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
6cd0: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
6ce0: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6cf0: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
6d00: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6d10: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6d20: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6d30: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
6d50: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
6d60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6d70: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
6d80: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
6d90: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
6da0: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
6db0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
6dc0: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
6dd0: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
6de0: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
6df0: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
6e00: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
6e10: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
6e30: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6e40: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
6e50: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
6e60: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
6e70: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
6e80: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
6e90: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
6ea0: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6eb0: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
6ec0: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
6ed0: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
6ee0: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
6ef0: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
6f00: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
6f10: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
6f20: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
6f30: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
6f40: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
6f50: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
6f60: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
6f70: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6f80: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
6f90: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
6fa0: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
6fb0: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
6fc0: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
6fd0: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
6fe0: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
6ff0: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7000: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7010: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
7020: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
7030: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
7040: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
7050: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
7060: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
7070: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
7080: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
7090: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
70a0: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
70b0: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
70c0: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
70d0: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
70e0: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
70f0: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7100: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7110: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
7120: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
7130: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
7140: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
7150: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
7160: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
7170: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7180: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7190: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
71a0: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
71b0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
71c0: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
71d0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
71e0: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
71f0: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7200: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7210: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
7220: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
7230: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
7240: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
7250: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
7260: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
7270: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7280: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7290: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
72a0: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
72b0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
72c0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
72d0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
72e0: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
72f0: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7300: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7310: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
7320: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
7330: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7340: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
7350: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7360: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
7370: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7380: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7390: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
73a0: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
73b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
73c0: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
73d0: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
73e0: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
73f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7400: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7410: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
7420: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
7430: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
7440: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
7450: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
7460: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
7470: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7480: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7490: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
74a0: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
74b0: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
74c0: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
74d0: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
74e0: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
74f0: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7500: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7510: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
7520: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
7530: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
7540: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
7550: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
7560: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
7570: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7580: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7590: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
75a0: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
75b0: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
75c0: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
75d0: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
75e0: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
75f0: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7600: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7610: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
7620: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
7630: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
7640: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
7650: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
7660: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
7670: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7680: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7690: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
76a0: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
76b0: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
76c0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
76d0: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
76e0: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
76f0: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7700: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
7710: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
7720: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
7730: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
7740: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
7750: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
7760: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
7770: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
7780: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
7790: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
77a0: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
77b0: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
77c0: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
77d0: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
77e0: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
77f0: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
7800: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
7810: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
7820: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
7830: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
7840: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
7850: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
7860: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
7870: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
7880: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
7890: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
78a0: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
78b0: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
78c0: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
78d0: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
78e0: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
78f0: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
7900: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
7910: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
7920: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
7930: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
7940: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
7950: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
7960: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
7970: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
7980: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7990: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
79a0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
79b0: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
79c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
79d0: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
79e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
79f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7a00: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7a10: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7a20: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
7a30: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
7a40: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
7a50: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
7a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7a70: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
7a80: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7a90: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
7aa0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
7ab0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
7ac0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7ad0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
7ae0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7af0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7b00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7b10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
7b20: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
7b30: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7b40: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
7b50: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7b60: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7b70: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b90: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
7ba0: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
7bb0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7bc0: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
7bd0: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
7be0: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
7bf0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7c20: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
7c30: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
7c40: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
7c50: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
7c60: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
7c70: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
7c80: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
7c90: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
7ca0: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
7cb0: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
7cc0: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
7cd0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7ce0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7cf0: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
7d00: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
7d10: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7d20: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7d30: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
7d40: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
7d50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
7d60: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
7d70: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
7d80: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
7d90: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
7da0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7db0: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
7dc0: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
7dd0: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
7de0: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
7df0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
7e00: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
7e10: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
7e20: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
7e30: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
7e40: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
7e50: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
7e60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
7e70: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7e80: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
7e90: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
7ea0: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
7eb0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7ec0: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
7ed0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
7ee0: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
7ef0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7f00: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
7f10: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
7f20: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
7f30: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
7f40: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
7f50: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
7f60: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
7f70: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
7f80: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
7f90: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68   pMaskSet);.  wh
7fa0: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
7fb0: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
7fc0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
7fd0: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
7fe0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7ff0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8000: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
8010: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
8020: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
8030: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
8040: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
8050: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
8060: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
8070: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
8080: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8090: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
80a0: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
80b0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
80c0: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
80d0: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
80e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
80f0: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
8100: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8110: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
8120: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
8130: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
8140: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
8150: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
8160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
8170: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8180: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8190: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
81a0: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
81b0: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
81c0: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
81d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
81e0: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
81f0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
8200: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8210: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
8220: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
8230: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
8240: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
8250: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
8260: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
8270: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
8280: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8290: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
82a0: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
82b0: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
82c0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
82d0: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
82e0: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
82f0: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
8300: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8310: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
8320: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
8330: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
8340: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
8350: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
8360: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
8370: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8380: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8390: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
83a0: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
83b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
83c0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
83d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
83e0: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
83f0: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8400: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8410: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
8420: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
8430: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
8440: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
8450: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
8460: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
8470: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8480: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8490: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
84a0: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
84b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
84c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
84d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
84e0: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
84f0: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8500: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8510: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8520: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
8530: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
8540: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
8550: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
8560: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
8570: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8580: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8590: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
85a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
85b0: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
85c0: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
85d0: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
85e0: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
85f0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8600: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8610: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
8620: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
8630: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
8640: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
8650: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
8660: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
8670: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
8680: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
8690: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
86a0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
86b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
86c0: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
86d0: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
86e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
86f0: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
8700: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8710: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
8720: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
8730: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
8740: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
8750: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
8760: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
8770: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
8780: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
8790: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
87a0: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
87b0: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
87c0: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
87d0: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
87e0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
87f0: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
8800: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
8810: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
8820: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
8830: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
8840: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
8850: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
8860: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
8870: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
8880: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
8890: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
88a0: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
88b0: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
88c0: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
88d0: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
88e0: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
88f0: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
8900: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
8910: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
8920: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
8930: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
8940: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
8950: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
8960: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
8970: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
8980: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
8990: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
89a0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
89b0: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
89c0: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
89d0: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
89e0: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
89f0: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
8a00: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
8a10: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
8a20: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
8a30: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
8a40: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
8a50: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
8a60: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
8a70: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
8a80: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
8a90: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
8aa0: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
8ab0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
8ac0: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
8ad0: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
8ae0: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
8af0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
8b00: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
8b10: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
8b20: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
8b30: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
8b40: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
8b50: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
8b60: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8b70: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
8b80: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
8b90: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
8ba0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8bb0: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
8bc0: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
8bd0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
8be0: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
8bf0: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
8c00: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
8c10: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
8c20: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
8c30: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8c40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8c50: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
8c60: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
8c70: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
8c80: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8c90: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
8ca0: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
8cb0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
8cc0: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
8cd0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
8ce0: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
8cf0: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
8d00: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
8d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8d20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8d30: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8d40: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8d50: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8d60: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8d70: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8d80: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8d90: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8da0: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8db0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8dc0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
8dd0: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
8de0: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
8df0: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
8e00: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
8e10: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8e20: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8e30: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8e40: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8e50: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8e60: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8e70: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8e80: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8e90: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8ea0: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8eb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8ec0: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
8ed0: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
8ee0: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8ef0: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
8f00: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8f10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f20: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8f30: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8f40: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8f50: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8f60: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8f70: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
8f80: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
8f90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
8fa0: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
8fb0: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
8fc0: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
8fd0: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
8fe0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
8ff0: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9000: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9010: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
9020: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
9030: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
9040: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
9050: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9060: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
9070: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9080: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9090: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
90a0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
90b0: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
90c0: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
90d0: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
90e0: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
90f0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9100: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9110: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
9120: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
9130: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
9140: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
9150: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
9160: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
9170: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9180: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9190: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
91a0: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
91b0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
91c0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
91d0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
91e0: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
91f0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9200: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9210: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
9220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9230: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9240: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
9250: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
9260: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
9270: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9280: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9290: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
92a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
92b0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
92c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
92d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
92e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
92f0: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9300: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9310: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
9320: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
9330: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
9340: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
9350: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
9360: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9370: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9380: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9390: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
93a0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
93b0: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
93c0: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
93d0: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
93e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
93f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9400: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9410: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
9420: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
9430: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
9440: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
9450: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
9460: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
9470: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9480: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9490: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
94a0: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
94b0: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
94c0: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
94d0: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
94e0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
94f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9500: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9510: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
9520: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
9530: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
9540: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
9550: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9560: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
9570: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9580: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9590: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
95a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
95b0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
95c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
95d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
95e0: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
95f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9600: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9610: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
9620: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
9630: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
9640: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
9650: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
9660: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
9670: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
9680: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
9690: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
96a0: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
96b0: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
96c0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
96d0: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
96e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
96f0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9700: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
9710: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
9720: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
9730: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
9740: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
9750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
9760: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
9770: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
9780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
9790: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
97a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
97b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
97c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
97d0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
97e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9800: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9810: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
9820: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
9830: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
9840: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
9850: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
9860: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
9870: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
9880: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
9890: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
98a0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
98b0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
98c0: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
98d0: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
98e0: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
98f0: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
9900: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
9910: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9920: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
9930: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
9940: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
9950: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9960: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
9970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
9980: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9990: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
99a0: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
99b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
99c0: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
99d0: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
99e0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
99f0: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9a00: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9a10: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9a20: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
9a30: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9a40: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
9a50: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
9a60: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9a70: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
9a80: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9a90: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
9aa0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9ab0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9ac0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
9ad0: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
9ae0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
9af0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9b00: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9b10: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9b20: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9b30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9b40: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
9b50: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9b60: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9b70: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9b80: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9b90: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9ba0: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9bb0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9bc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9bd0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
9be0: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
9bf0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9c00: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
9c10: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
9c20: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
9c30: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9c40: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9c50: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9c60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9c70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9c80: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9c90: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9ca0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9cb0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9cc0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9cd0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9ce0: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
9cf0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
9d00: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9d10: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
9d20: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
9d30: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9d40: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9d50: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9d60: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9d70: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9d80: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9d90: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9da0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9db0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9dc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9dd0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
9de0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9df0: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
9e00: 74 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73  tor = 0;  /* cas
9e10: 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20  e 1 trumps case 
9e20: 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  2 */.    }.  }.}
9e30: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
9e40: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
9e50: 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49  IZATION && !SQLI
9e60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9e70: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   */.../*.** The 
9e80: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
9e90: 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72  utine is an Wher
9ea0: 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20  eTerm structure 
9eb0: 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  with only the.**
9ec0: 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66   "pExpr" field f
9ed0: 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a  illed in.  The j
9ee0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
9ef0: 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65  ne is to analyze
9f00: 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65   the.** subexpre
9f10: 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61  ssion and popula
9f20: 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  te all the other
9f30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57   fields of the W
9f40: 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75  hereTerm.** stru
9f50: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
9f60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9f70: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  s of the form "<
9f80: 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74  expr> <op> X" it
9f90: 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a   gets commuted.*
9fa0: 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72  * to the standar
9fb0: 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70  d form of "X <op
9fc0: 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a  > <expr>"..**.**
9fd0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9fe0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9ff0: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
a000: 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20  re both X and Y 
a010: 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20  are.** columns, 
a020: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
a030: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  l expression is 
a040: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
a050: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
a060: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
a070: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
a080: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
a090: 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61   clause and.** a
a0a0: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
a0b0: 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  ly.  The origina
a0c0: 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  l term is marked
a0d0: 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45   with TERM_COPIE
a0e0: 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77  D.** and the new
a0f0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
a100: 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49  with TERM_DYNAMI
a110: 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20  C (because it's 
a120: 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74  pExpr.** needs t
a130: 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20  o be freed with 
a140: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29  the WhereClause)
a150: 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41   and TERM_VIRTUA
a160: 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a  L (because it.**
a170: 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63   is a commuted c
a180: 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74  opy of a prior t
a190: 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69  erm.)  The origi
a1a0: 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68  nal term has nCh
a1b0: 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65  ild=1.** and the
a1c0: 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72   copy has idxPar
a1d0: 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69  ent set to the i
a1e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67  ndex of the orig
a1f0: 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  inal term..*/.st
a200: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
a210: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
a220: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
a230: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
a240: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
a250: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
a260: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
a270: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
a280: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
a290: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a2a0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
a2b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
a2c0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
a2d0: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
a2e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d       /* The term
a2f0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
a300: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
a310: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
a320: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
a330: 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b  table index mask
a340: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  s */.  Expr *pEx
a350: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
a360: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
a370: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
a380: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69  analyzed */.  Bi
a390: 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74  tmask prereqLeft
a3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a3b0: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a3c0: 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  of the pExpr->pL
a3d0: 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  eft */.  Bitmask
a3e0: 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20   prereqAll;     
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
a400: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45  requesites of pE
a410: 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  xpr */.  Bitmask
a420: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b   extraRight = 0;
a430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
a440: 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ra dependencies 
a450: 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a  on LEFT JOIN */.
a460: 20 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20    Expr *pStr1 = 
a470: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a480: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
a490: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
a4a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  */.  int isCompl
a4b0: 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ete = 0;        
a4c0: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
a4d0: 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77  LIKE/GLOB ends w
a4e0: 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  ith wildcard */.
a4f0: 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30    int noCase = 0
a500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a510: 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20     /* LIKE/GLOB 
a520: 64 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61  distinguishes ca
a530: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  se */.  int op; 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d           /* Top-
a560: 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20  level operator. 
a570: 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20   pExpr->op */.  
a580: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
a590: 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20  pWC->pParse;    
a5a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a5b0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
a5c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a5d0: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
a5e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a5f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
a600: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a610: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
a620: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
a630: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61  [idxTerm];.  pMa
a640: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
a650: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
a660: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
a670: 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78   prereqLeft = ex
a680: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
a690: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c  skSet, pExpr->pL
a6a0: 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78  eft);.  op = pEx
a6b0: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
a6c0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  ==TK_IN ){.    a
a6d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
a6e0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
a6f0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a700: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
a710: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a720: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a730: 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74  ght = exprSelect
a740: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a750: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Set, pExpr->x.pS
a760: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
a770: 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e{.      pTerm->
a780: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
a790: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
a7a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a7b0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
a7c0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
a7d0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
a7e0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
a7f0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
a800: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
a810: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
a820: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
a830: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
a840: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
a850: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
a860: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a870: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
a880: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a890: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
a8a0: 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73  n) ){.    Bitmas
a8b0: 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  k x = getMask(pM
a8c0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  askSet, pExpr->i
a8d0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b  RightJoinTable);
a8e0: 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c  .    prereqAll |
a8f0: 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69  = x;.    extraRi
a900: 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f  ght = x-1;  /* O
a910: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  N clause terms m
a920: 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77  ay not be used w
a930: 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20  ith an index.   
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74      ** on left t
a960: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
a970: 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  OIN.  Ticket #30
a980: 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72  15 */.  }.  pTer
a990: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
a9a0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72  rereqAll;.  pTer
a9b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a9c0: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  -1;.  pTerm->iPa
a9d0: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rent = -1;.  pTe
a9e0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
a9f0: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64  0;.  if( allowed
aa00: 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d  Op(op) && (pTerm
aa10: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
aa20: 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29  prereqLeft)==0 )
aa30: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
aa40: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
aa50: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
aa60: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
aa70: 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66  ht;.    if( pLef
aa80: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
aa90: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
aaa0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
aab0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
aac0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74     pTerm->u.left
aad0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aae0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
aaf0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
ab00: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
ab10: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
ab20: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
ab30: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
ab40: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
ab50: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
ab60: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
ab70: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
ab80: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
ab90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
aba0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
abb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
abc0: 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
abd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
abe0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
abf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ac00: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
ac10: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
ac20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
ac30: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e    }.        idxN
ac40: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
ac50: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
ac60: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
ac70: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
ac80: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
ac90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
aca0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
acb0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
acc0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
acd0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
ace0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
acf0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
ad00: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
ad10: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
ad20: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
ad30: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
ad40: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
ad50: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
ad60: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
ad70: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
ad80: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
ad90: 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44  mmute(pParse, pD
ada0: 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  up);.      pLeft
adb0: 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a   = pDup->pLeft;.
adc0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
add0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
ade0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
adf0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
ae00: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
ae10: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
ae20: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
ae30: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
ae40: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
ae50: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
ae60: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
ae70: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
ae80: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
ae90: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
aea0: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
aeb0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
aec0: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
aed0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
aee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aef0: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
af00: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
af10: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
af20: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
af30: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
af40: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
af50: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
af60: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
af70: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
af80: 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  nts.  For exampl
af90: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
afa0: 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e    a BETWEEN b AN
afb0: 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  D c.  **.  ** is
afc0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a   converted into:
afd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
afe0: 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44  (a BETWEEN b AND
aff0: 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41   c) AND (a>=b) A
b000: 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20  ND (a<=c).  **. 
b010: 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20   ** The two new 
b020: 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20  terms are added 
b030: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
b040: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
b050: 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65  object..  ** The
b060: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22   new terms are "
b070: 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65  dynamic" and are
b080: 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65   children of the
b090: 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45   original BETWEE
b0a0: 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68  N.  ** term.  Th
b0b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  at means that if
b0c0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72   the BETWEEN ter
b0d0: 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20  m is coded, the 
b0e0: 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a  children are.  *
b0f0: 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20  * skipped.  Or, 
b100: 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20  if the children 
b110: 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79  are satisfied by
b120: 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
b130: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54  riginal.  ** BET
b140: 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69  WEEN term is ski
b150: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
b160: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
b170: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70  =TK_BETWEEN && p
b180: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
b190: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
b1a0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
b1b0: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  .pList;.    int 
b1c0: 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  i;.    static co
b1d0: 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b  nst u8 ops[] = {
b1e0: 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20  TK_GE, TK_LE};. 
b1f0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
b200: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
b210: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  t( pList->nExpr=
b220: 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =2 );.    for(i=
b230: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
b240: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b250: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  pr;.      int id
b260: 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  xNew;.      pNew
b270: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
b280: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b  xpr(pParse, ops[
b290: 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  i], .           
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
b2c0: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
b2d0: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b300: 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
b310: 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29  i].pExpr, 0), 0)
b320: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
b330: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
b340: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
b350: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b360: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b370: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
b380: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
b390: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
b3a0: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
b3b0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
b3c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b3d0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b3e0: 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20  xNew].iParent = 
b3f0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  idxTerm;.    }. 
b400: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
b410: 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 2;.  }.#endif
b420: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b430: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
b440: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65  TION */..#if !de
b450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b460: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
b470: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b490: 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  ERY).  /* Analyz
b4a0: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73  e a term that is
b4b0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f   composed of two
b4c0: 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d   or more subterm
b4d0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  s connected by. 
b4e0: 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74   ** an OR operat
b4f0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  or..  */.  else 
b500: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b510: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65  K_OR ){.    asse
b520: 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  rt( pWC->op==TK_
b530: 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41  AND );.    exprA
b540: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72  nalyzeOrTerm(pSr
b550: 63 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29  c, pWC, idxTerm)
b560: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
b570: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b580: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b590: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
b5a0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b5b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b5c0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b5d0: 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e  ION.  /* Add con
b5e0: 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75  straints to redu
b5f0: 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
b600: 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72  ace on a LIKE or
b610: 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61   GLOB.  ** opera
b620: 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  tor..  **.  ** A
b630: 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66   like pattern of
b640: 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b   the form "x LIK
b650: 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61  E 'abc%'" is cha
b660: 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72  nged into constr
b670: 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  aints.  **.  ** 
b680: 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63           x>='abc
b690: 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e  ' AND x<'abd' AN
b6a0: 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a  D x LIKE 'abc%'.
b6b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61    **.  ** The la
b6c0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
b6d0: 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22  the prefix "abc"
b6e0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
b6f0: 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a  to form the.  **
b700: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e   termination con
b710: 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20  dition "abd"..  
b720: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
b730: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
b740: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
b750: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
b760: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
b770: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
b780: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
b790: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
b7a0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
b7b0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
b7c0: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
b7d0: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
b7e0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
b7f0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
b800: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
b810: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
b820: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
b830: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
b840: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
b850: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
b860: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
b870: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
b880: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b890: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
b8a0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
b8b0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
b8c0: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
b8d0: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
b8e0: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
b8f0: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
b900: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
b910: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
b920: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b930: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
b940: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
b950: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
b960: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
b970: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
b980: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
b990: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
b9a0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b9b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
b9c0: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
b9d0: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
b9e0: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
b9f0: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
ba00: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
ba10: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
ba20: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
ba30: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
ba40: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
ba50: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
ba60: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
ba70: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
ba80: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
ba90: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
baa0: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
bab0: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
bac0: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
bad0: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
bae0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
baf0: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
bb00: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 63 20  = 0;..        c 
bb10: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
bb20: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
bb30: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
bb40: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
bb50: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
bb60: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bb70: 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78  TK_GE, sqlite3Ex
bb80: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30  prDup(db,pLeft,0
bb90: 29 2c 70 53 74 72 31 2c 30 29 3b 0a 20 20 20 20  ),pStr1,0);.    
bba0: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
bbb0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
bbc0: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
bbd0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
bbe0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
bbf0: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
bc00: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
bc10: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
bc20: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
bc30: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
bc40: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bc50: 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _LT, sqlite3Expr
bc60: 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c  Dup(db,pLeft,0),
bc70: 70 53 74 72 32 2c 30 29 3b 0a 20 20 20 20 69 64  pStr2,0);.    id
bc80: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
bc90: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
bca0: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
bcb0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
bcc0: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
bcd0: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
bce0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
bcf0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
bd00: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
bd10: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
bd20: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
bd30: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
bd40: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
bd50: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
bd60: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
bd70: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
bd80: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bd90: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bda0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
bdb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bdc0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
bdd0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
bde0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bdf0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
be00: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
be10: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
be20: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
be30: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
be40: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
be50: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
be60: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
be70: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
be80: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
be90: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
bea0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
beb0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
bec0: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
bed0: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
bee0: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
bef0: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
bf00: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
bf10: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
bf20: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
bf30: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
bf40: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
bf50: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
bf60: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
bf70: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
bf80: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
bf90: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
bfa0: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
bfb0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
bfc0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
bfd0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
bfe0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
bff0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c000: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
c010: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c020: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
c030: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
c040: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
c050: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c060: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
c070: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
c080: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
c090: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c0a0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
c0b0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c0c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c0d0: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20  MATCH, .        
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
c100: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
c110: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
c120: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c130: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c140: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
c150: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c160: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
c170: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c180: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
c190: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c1a0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
c1b0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
c1c0: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
c1d0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c1e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c1f0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c200: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c210: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c220: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c230: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c240: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
c250: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c260: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c270: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c280: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c290: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c2a0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c2b0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c2c0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c2d0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c2e0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c2f0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c310: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c320: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c330: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
c340: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
c350: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
c360: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
c370: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
c380: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
c390: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
c3a0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
c3b0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c3c0: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
c3d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c3e0: 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66  n TRUE if any of
c3f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
c400: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69   in pList->a[iFi
c410: 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a  rst...] contain.
c420: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
c430: 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  o any table othe
c440: 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73 65  r than the iBase
c450: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
c460: 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73  c int references
c470: 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45  OtherTables(.  E
c480: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c490: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
c4a0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ch expressions i
c4b0: 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20  n ths list */.  
c4c0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
c4d0: 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70  askSet,   /* Map
c4e0: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  ping from tables
c4f0: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
c500: 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
c510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
c520: 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68 20   searching with 
c530: 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65 78  the iFirst-th ex
c540: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
c550: 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20 20  t iBase         
c560: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
c570: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
c580: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
c590: 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77  .  Bitmask allow
c5a0: 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  ed = ~getMask(pM
c5b0: 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a  askSet, iBase);.
c5c0: 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c    while( iFirst<
c5d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
c5e0: 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62      if( (exprTab
c5f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c600: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  , pList->a[iFirs
c610: 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f  t++].pExpr)&allo
c620: 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  wed)!=0 ){.     
c630: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c640: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c650: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
c660: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
c670: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
c680: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
c690: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
c6a0: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
c6b0: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
c6c0: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
c6d0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
c6e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
c6f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
c700: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
c710: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
c720: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
c730: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
c740: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
c750: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
c760: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
c770: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
c780: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
c790: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
c7a0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
c7b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
c7c0: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
c7d0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
c7e0: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
c7f0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c800: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
c810: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
c820: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
c830: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
c840: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
c850: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
c860: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
c870: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
c880: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
c890: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
c8b0: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
c8c0: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
c8d0: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
c8e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
c8f0: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
c900: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
c910: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
c920: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
c930: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
c940: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
c950: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
c960: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
c970: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
c980: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
c990: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c9a0: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
c9b0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
c9c0: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
c9d0: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
c9e0: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
c9f0: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
ca00: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
ca10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ca20: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ca30: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ca40: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
ca50: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
ca60: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
ca70: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
ca80: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
ca90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
caa0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
cab0: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
cac0: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
cad0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
cae0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
caf0: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
cb00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
cb10: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
cb20: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
cb30: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
cb40: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
cb50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
cb60: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
cb70: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
cb80: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cba0: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
cbb0: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
cbc0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cbf0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ters */.  int so
cc00: 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20  rtOrder = 0;    
cc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52            /* XOR
cc20: 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f 52   of index and OR
cc30: 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72 65  DER BY sort dire
cc40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
cc50: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
cc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cc70: 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
cc80: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75   terms */.  stru
cc90: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
cca0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41   *pTerm;    /* A
ccb0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
ccc0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
ccd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cce0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
ccf0: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
cd00: 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20  =0 );.  nTerm = 
cd10: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
cd20: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d  .  assert( nTerm
cd30: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75  >0 );..  /* Argu
cd40: 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65  ment pIdx must e
cd50: 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61  ither point to a
cd60: 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e   'real' named in
cd70: 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a  dex structure, .
cd80: 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78    ** or an index
cd90: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
cda0: 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
cdb0: 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49 6e  k by bestBtreeIn
cdc0: 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  dex() to.  ** re
cdd0: 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
cde0: 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  d index that is 
cdf0: 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74 61  part of every ta
ce00: 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ble.  */.  asser
ce10: 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c  t( pIdx->zName |
ce20: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
ce30: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43  ==1 && pIdx->aiC
ce40: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b  olumn[0]==-1) );
ce50: 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
ce60: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
ce70: 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
ce80: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
ce90: 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
cea0: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
ceb0: 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49   indices have pI
cec0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75  dx->nColumn regu
ced0: 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  lar columns plus
cee0: 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69  .  ** one additi
cef0: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  onal column cont
cf00: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  aining the rowid
cf10: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  .  The rowid col
cf20: 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  umn.  ** of the 
cf30: 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c  index is also al
cf40: 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61  lowed to match a
cf50: 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52  gainst the ORDER
cf60: 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e   BY.  ** clause.
cf70: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
cf80: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
cf90: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
cfa0: 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i<=pIdx->nColum
cfb0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
cfc0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
cfd0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
cfe0: 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  n of the ORDER B
cff0: 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43  Y pTerm */.    C
d000: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
d010: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
d020: 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70  ng sequence of p
d030: 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
d040: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f  termSortOrder; /
d050: 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  * Sort order for
d060: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
d070: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
d080: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
d090: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
d0a0: 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f  ndex.  -1 for ro
d0b0: 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
d0c0: 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a  SortOrder;    /*
d0d0: 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66   1 for DESC, 0 f
d0e0: 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d  or ASC on the i-
d0f0: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d100: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d110: 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20  *zColl; /* Name 
d120: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  of the collating
d130: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
d140: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d150: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
d160: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
d170: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
d180: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
d190: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
d1a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
d1b0: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
d1c0: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
d1d0: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
d1e0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
d1f0: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
d200: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
d210: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
d220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d230: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d240: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d250: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
d260: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
d270: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64  .      pColl = d
d280: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
d290: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
d2a0: 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
d2b0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
d2c0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
d2d0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d2e0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
d2f0: 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
d300: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
d310: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
d320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d330: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
d340: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
d350: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
d360: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
d370: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d380: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
d390: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
d3a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  = 0;.      zColl
d3b0: 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
d3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d3d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
d3e0: 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65  Column || sqlite
d3f0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
d400: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
d410: 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a  .      /* Term j
d420: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d430: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
d440: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20   match column i 
d450: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
d460: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43        if( i<nEqC
d470: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
d480: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
d490: 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73  umn that is cons
d4a0: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61  trained by == fa
d4b0: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a  ils to match an.
d4c0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
d4d0: 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69   BY term, that i
d4e0: 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f  s OK.  Just igno
d4f0: 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f  re that column o
d500: 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
d510: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
d520: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
d530: 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78  else if( i==pIdx
d540: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
d550: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f       /* Index co
d560: 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f  lumn i is the ro
d570: 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  wid.  All other 
d580: 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a  terms match. */.
d590: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d5a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d5b0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
d5c0: 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20  ex column fails 
d5d0: 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20  to match and is 
d5e0: 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
d5f0: 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a  by ==.        **
d600: 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
d610: 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74  cannot satisfy t
d620: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73  he ORDER BY cons
d630: 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20  traint..        
d640: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
d650: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
d660: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
d670: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  Idx->aSortOrder!
d680: 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d  =0 || iColumn==-
d690: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
d6a0: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
d6b0: 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73  r==0 || pTerm->s
d6c0: 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20  ortOrder==1 );. 
d6d0: 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74     assert( iSort
d6e0: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72  Order==0 || iSor
d6f0: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
d700: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d   termSortOrder =
d710: 20 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54   iSortOrder ^ pT
d720: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
d730: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
d740: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65   ){.      if( te
d750: 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72  rmSortOrder!=sor
d760: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
d770: 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e    /* Indices can
d780: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
d790: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
d7a0: 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  rms past the.   
d7b0: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
d7c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
d7d0: 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43   all either DESC
d7e0: 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20   or ASC. */.    
d7f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d800: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d810: 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
d820: 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
d830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
d840: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
d850: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
d860: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
d870: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
d880: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c  By, pMaskSet, j,
d890: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20   base) ){.      
d8a0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65  /* If the indexe
d8b0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  d column is the 
d8c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20  primary key and 
d8d0: 65 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68  everything match
d8e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66  es.      ** so f
d8f0: 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  ar and none of t
d900: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
d910: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 72  s to the right r
d920: 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20  eference other. 
d930: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69       ** tables i
d940: 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e  n the join, then
d950: 20 77 65 20 61 72 65 20 61 73 73 75 72 65 64 20   we are assured 
d960: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 63  that the index c
d970: 61 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20 20  an be used .    
d980: 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63    ** to sort bec
d990: 61 75 73 65 20 74 68 65 20 70 72 69 6d 61 72 79  ause the primary
d9a0: 20 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20 61   key is unique a
d9b0: 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68  nd so none of th
d9c0: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
d9d0: 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61   columns will ma
d9e0: 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63  ke any differenc
d9f0: 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
da00: 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   j = nTerm;.    
da10: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20  }.  }..  *pbRev 
da20: 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a  = sortOrder!=0;.
da30: 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29    if( j>=nTerm )
da40: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
da50: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
da60: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f  BY clause are co
da70: 76 65 72 65 64 20 62 79 20 74 68 69 73 20 69 6e  vered by this in
da80: 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68  dex so.    ** th
da90: 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  is index can be 
daa0: 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
dab0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
dac0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  1;.  }.  if( pId
dad0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
dae0: 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e  one && i==pIdx->
daf0: 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26  nColumn.      &&
db00: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
db10: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
db20: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
db30: 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ase) ){.    /* A
db40: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73  ll terms of this
db50: 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d   index match som
db60: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
db70: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
db80: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69      ** and the i
db90: 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61  ndex is UNIQUE a
dba0: 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74  nd no terms on t
dbb0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f  he tail of the O
dbc0: 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
dbd0: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20  lause reference 
dbe0: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
dbf0: 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73  a join.  If this
dc00: 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65   is all true the
dc10: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64  n.    ** the ord
dc20: 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20  er by clause is 
dc30: 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a  superfluous. */.
dc40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
dc50: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
dc60: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
dc70: 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20   crude estimate 
dc80: 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d  of the logarithm
dc90: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61   of the input va
dca0: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  lue..** The resu
dcb0: 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  lts need not be 
dcc0: 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20  exact.  This is 
dcd0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73  only used for es
dce0: 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  timating.** the 
dcf0: 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65  total cost of pe
dd00: 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69  rforming operati
dd10: 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29  ons with O(logN)
dd20: 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20   or O(NlogN).** 
dd30: 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63  complexity.  Bec
dd40: 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61  ause N is just a
dd50: 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f   guess, it is no
dd60: 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69   great tragedy i
dd70: 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c  f.** logN is a l
dd80: 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74  ittle off..*/.st
dd90: 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c  atic double estL
dda0: 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20  og(double N){.  
ddb0: 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b  double logN = 1;
ddc0: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
ddd0: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29  ;.  while( N>x )
dde0: 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b  {.    logN += 1;
ddf0: 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20  .    x *= 10;.  
de00: 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b  }.  return logN;
de10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
de20: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
de30: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
de40: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
de50: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
de60: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
de70: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
de80: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
de90: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
dea0: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
deb0: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
dec0: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
ded0: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
dee0: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
def0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
df00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
df10: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
df20: 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
df30: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
df40: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
df50: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
df60: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
df70: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
df80: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
df90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
dfa0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
dfb0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
dfc0: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
dfd0: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
dfe0: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
dff0: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
e000: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
e010: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
e020: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
e030: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e040: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
e050: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e060: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
e070: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e080: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
e090: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
e0a0: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
e0b0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e0c0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
e0d0: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
e0e0: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
e0f0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
e100: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
e110: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
e120: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
e130: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
e140: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
e150: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
e160: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
e170: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
e180: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
e190: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
e1a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
e1b0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
e1c0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e1d0: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
e1e0: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
e1f0: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
e200: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e210: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
e220: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
e230: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e240: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
e250: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e260: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
e270: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
e280: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
e290: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e2a0: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
e2b0: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
e2c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e2d0: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
e2e0: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
e2f0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
e300: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e310: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
e320: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
e330: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d  stimatedCost);.}
e340: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
e350: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
e360: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
e370: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
e380: 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52  #endif../* .** R
e390: 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
e3a0: 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20 63  bestIndex() is c
e3b0: 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72 43  alled by bestOrC
e3c0: 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f  lauseIndex() .*/
e3d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
e3e0: 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61 72 73  tIndex(.    Pars
e3f0: 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  e*, WhereClause*
e400: 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
e410: 5f 69 74 65 6d 2a 2c 20 42 69 74 6d 61 73 6b 2c  _item*, Bitmask,
e420: 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68 65 72   ExprList*, Wher
e430: 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  eCost*);../*.** 
e440: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
e450: 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e  empts to find an
e460: 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65   scanning strate
e470: 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  gy that can be u
e480: 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d  sed .** to optim
e490: 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72  ize an 'OR' expr
e4a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
e4b0: 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63  art of a WHERE c
e4c0: 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  lause. .**.** Th
e4d0: 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
e4e0: 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61  ed with FROM cla
e4f0: 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61  use term pSrc ma
e500: 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a  y be either a.**
e510: 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20   regular B-Tree 
e520: 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75  table or a virtu
e530: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
e540: 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43  tic void bestOrC
e550: 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20 50 61  lauseIndex(.  Pa
e560: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e580: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
e590: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e5a0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e5b0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
e5c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
e5d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
e5e0: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
e5f0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
e600: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
e610: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
e620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
e630: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
e640: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
e650: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
e660: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
e670: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
e680: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
e690: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
e6a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
e6b0: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
e6c0: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66  y plan */.){.#if
e6d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e6e0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e6f0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75  .  const int iCu
e700: 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
e710: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
e720: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
e730: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
e740: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
e750: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
e760: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
e770: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
e780: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
e790: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
e7a0: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
e7b0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e7c0: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
e7d0: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
e7e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
e7f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
e800: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
e810: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
e820: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
e830: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 57 48  /* Search the WH
e840: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
e850: 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f   for a usable WO
e860: 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66  _OR term. */.  f
e870: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
e880: 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
e890: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
e8a0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
e8b0: 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26  r==WO_OR .     &
e8c0: 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  & ((pTerm->prere
e8d0: 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29  qAll & ~maskSrc)
e8e0: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
e8f0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
e900: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
e910: 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21  able & maskSrc)!
e920: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
e930: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63   WhereClause * c
e940: 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54  onst pOrWC = &pT
e950: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
e960: 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  wc;.      WhereT
e970: 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  erm * const pOrW
e980: 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61  CEnd = &pOrWC->a
e990: 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  [pOrWC->nTerm];.
e9a0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
e9b0: 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20  *pOrTerm;.      
e9c0: 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52  int flags = WHER
e9d0: 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20  E_MULTI_OR;.    
e9e0: 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20    double rTotal 
e9f0: 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  = 0;.      doubl
ea00: 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  e nRow = 0;.    
ea10: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
ea20: 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70   0;..      for(p
ea30: 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
ea40: 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
ea50: 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
ea60: 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74         WhereCost
ea70: 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20   sTermCost;.    
ea80: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
ea90: 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78  "... Multi-index
eaa0: 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20   OR testing for 
eab0: 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e  term %d of %d...
eac0: 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .\n", .         
ead0: 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57   (pOrTerm - pOrW
eae0: 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20  C->a), (pTerm - 
eaf0: 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20  pWC->a).        
eb00: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
eb10: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
eb20: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or==WO_AND ){.  
eb30: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
eb40: 75 73 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70  use *pAndWC = &p
eb50: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
eb60: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
eb70: 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
eb80: 73 65 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63  se, pAndWC, pSrc
eb90: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26  , notReady, 0, &
eba0: 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20  sTermCost);.    
ebb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
ebc0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
ebd0: 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20  r==iCur ){.     
ebe0: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
ebf0: 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20   tempWC;.       
ec00: 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65     tempWC.pParse
ec10: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
ec20: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
ec30: 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  .pMaskSet = pWC-
ec40: 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20  >pMaskSet;.     
ec50: 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
ec60: 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
ec70: 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
ec80: 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
ec90: 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20   tempWC.nTerm = 
eca0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  1;.          bes
ecb0: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
ecc0: 74 65 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  tempWC, pSrc, no
ecd0: 74 52 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72  tReady, 0, &sTer
ece0: 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  mCost);.        
ecf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ed00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ed10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f     }.        rTo
ed20: 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74  tal += sTermCost
ed30: 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
ed40: 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73  nRow += sTermCos
ed50: 74 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  t.nRow;.        
ed60: 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73  used |= sTermCos
ed70: 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20  t.used;.        
ed80: 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73  if( rTotal>=pCos
ed90: 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b  t->rCost ) break
eda0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
edb0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
edc0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
edd0: 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  se, increase the
ede0: 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63   scan cost to ac
edf0: 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  count .      ** 
ee00: 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20  for the cost of 
ee10: 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20  the sort. */.   
ee20: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 21     if( pOrderBy!
ee30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 54  =0 ){.        rT
ee40: 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  otal += nRow*est
ee50: 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20  Log(nRow);.     
ee60: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
ee70: 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72  ... sorting incr
ee80: 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20 74 6f  eases OR cost to
ee90: 20 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c   %.9g\n", rTotal
eea0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
eeb0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73     /* If the cos
eec0: 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73  t of scanning us
eed0: 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d  ing this OR term
eee0: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
eef0: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  n is.      ** le
ef00: 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  ss than the curr
ef10: 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20  ent cost stored 
ef20: 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63  in pCost, replac
ef30: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
ef40: 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74       ** of pCost
ef50: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
ef60: 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74  TRACE(("... mult
ef70: 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d  i-index OR cost=
ef80: 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e  %.9g nrow=%.9g\n
ef90: 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29  ", rTotal, nRow)
efa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
efb0: 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
efc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
efd0: 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
efe0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
eff0: 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ->nRow = nRow;. 
f000: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73         pCost->us
f010: 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20  ed = used;.     
f020: 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
f030: 73 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  sFlags = flags;.
f040: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f050: 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54  lan.u.pTerm = pT
f060: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
f070: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
f080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
f090: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
f0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
f0b0: 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70  query plan for p
f0c0: 53 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e  Src specified in
f0d0: 20 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c   pCost is a full
f0e0: 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61   table scan.** a
f0f0: 6e 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  n indexing is al
f100: 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
f110: 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
f120: 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
f130: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
f140: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
f150: 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
f160: 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
f170: 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
f180: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
f190: 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
f1a0: 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
f1b0: 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
f1c0: 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
f1d0: 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
f1e0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
f1f0: 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
f200: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
f210: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
f220: 73 74 54 72 61 6e 73 69 65 6e 74 49 6e 64 65 78  stTransientIndex
f230: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f240: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f250: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
f260: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f270: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
f280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
f290: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
f2a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f2b0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
f2c0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
f2d0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
f2e0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
f2f0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
f300: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
f310: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
f320: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
f330: 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
f340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
f350: 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
f360: 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75  plan */.){.  dou
f370: 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20  ble nTableRow;  
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
f390: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
f3a0: 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
f3b0: 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
f3c0: 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62       /* log(nTab
f3d0: 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62  leRow) */.  doub
f3e0: 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20  le costTempIdx; 
f3f0: 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71          /* per-q
f400: 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65  uery cost of the
f410: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
f420: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
f430: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
f440: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
f450: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
f460: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
f470: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
f480: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
f490: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
f4a0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f4c0: 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62  able tht might b
f4d0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  e indexed */..  
f4e0: 69 66 28 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e  if( (pCost->plan
f4f0: 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
f500: 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d  _NOT_FULLSCAN)!=
f510: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  0 ){.    /* We a
f520: 6c 72 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65  lready have some
f530: 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69   kind of index i
f540: 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 71  n use for this q
f550: 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74  uery. */.    ret
f560: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
f570: 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20  Src->notIndexed 
f580: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f  ){.    /* The NO
f590: 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
f5a0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
f5b0: 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  SQL. */.    retu
f5c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rn;.  }..  asser
f5d0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  t( pParse->nQuer
f5e0: 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65  yLoop >= (double
f5f0: 29 31 20 29 3b 0a 20 20 6e 54 61 62 6c 65 52 6f  )1 );.  nTableRo
f600: 77 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  w = pSrc->pIndex
f610: 20 3f 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 2d   ? pSrc->pIndex-
f620: 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31  >aiRowEst[0] : 1
f630: 30 30 30 30 30 30 3b 0a 20 20 6c 6f 67 4e 20 3d  000000;.  logN =
f640: 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52 6f   estLog(nTableRo
f650: 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49 64  w);.  costTempId
f660: 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62  x = 2*logN*(nTab
f670: 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e 51  leRow/pParse->nQ
f680: 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20  ueryLoop + 1);. 
f690: 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64 78   if( costTempIdx
f6a0: 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  >=pCost->rCost )
f6b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73  {.    /* The cos
f6c0: 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20 74 68  t of creating th
f6d0: 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
f6e0: 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65 61 74  e would be great
f6f0: 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64  er than.    ** d
f700: 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 61  oing the full ta
f710: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  ble scan */.    
f720: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
f730: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 79  * Search for any
f740: 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
f750: 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70  ison term */.  p
f760: 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
f770: 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
f780: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
f790: 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
f7a0: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
f7b0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
f7c0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
f7d0: 65 66 74 43 75 72 73 6f 72 3d 3d 70 53 72 63 2d  eftCursor==pSrc-
f7e0: 3e 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20  >iCursor.       
f7f0: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
f800: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
f810: 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  y)==0.       && 
f820: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f830: 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20  r & WO_EQ)!=0.  
f840: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
f850: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
f860: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 0a 20 20 20  Term->pExpr,.   
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
f890: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  able->aCol[pTerm
f8a0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
f8b0: 61 66 66 69 6e 69 74 79 29 0a 20 20 20 20 29 7b  affinity).    ){
f8c0: 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
f8d0: 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72  E(("auto-index r
f8e0: 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d  educes cost from
f8f0: 20 25 2e 32 66 20 74 6f 20 25 2e 32 66 5c 6e 22   %.2f to %.2f\n"
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f910: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
f920: 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29  st, costTempIdx)
f930: 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
f940: 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70  rCost = costTemp
f950: 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Idx;.      pCost
f960: 2d 3e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20  ->nRow = logN + 
f970: 31 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  1;.      pCost->
f980: 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57  plan.wsFlags = W
f990: 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  HERE_TEMP_INDEX;
f9a0: 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
f9b0: 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ed = pTerm->prer
f9c0: 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62  eqRight;.      b
f9d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f9f0: 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
fa00: 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20  uct a transient 
fa10: 69 6e 64 65 78 2e 20 20 41 6c 73 6f 20 63 72 65  index.  Also cre
fa20: 61 74 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ate the.** corre
fa30: 73 70 6f 6e 64 69 6e 67 20 49 6e 64 65 78 20 73  sponding Index s
fa40: 74 72 75 63 74 75 72 65 20 61 6e 64 20 70 75 74  tructure and put
fa50: 20 69 74 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 70   it in pLevel->p
fa60: 6c 61 6e 2e 75 2e 70 49 64 78 2e 0a 2a 2f 0a 73  lan.u.pIdx..*/.s
fa70: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74  tatic void const
fa80: 72 75 63 74 54 72 61 6e 73 69 65 6e 74 49 6e 64  ructTransientInd
fa90: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
faa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
fab0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
fac0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
fad0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
fae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
faf0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
fb00: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
fb10: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
fb20: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
fb30: 65 20 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68  e term to get th
fb40: 65 20 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a  e next index */.
fb50: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
fb60: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
fb70: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
fb80: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
fb90: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  ailable */.  Whe
fba0: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
fbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
fbc0: 65 20 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65  e new index here
fbd0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f   */.){.  int nCo
fbe0: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
fbf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fc00: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
fc10: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64   constructed ind
fc20: 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
fc30: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
fc40: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
fc50: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
fc60: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
fc70: 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
fc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
fc90: 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
fca0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcc0: 20 42 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20   Byte of memory 
fcd0: 6e 65 65 64 65 64 20 66 6f 72 20 70 49 64 78 20  needed for pIdx 
fce0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fcf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd00: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
fd10: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
fd20: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
fd30: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
fd40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
fd50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
fd60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fd70: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
fd80: 49 73 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  IsInit;         
fd90: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
fda0: 20 73 65 74 20 62 79 20 69 6e 69 74 69 61 6c 69   set by initiali
fdb0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  zation */.  int 
fdc0: 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20  addrInit;       
fdd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
fde0: 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ss of the initia
fdf0: 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20  lization bypass 
fe00: 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20  jump */.  Table 
fe10: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
fe20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
fe30: 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
fe40: 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
fe50: 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20  Keyinfo;        
fe60: 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
fe70: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64  tion for the ind
fe80: 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61  ex */   .  int a
fe90: 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
fea0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
feb0: 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20   the index fill 
fec0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  loop */.  int re
fed0: 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
fee0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
fef0: 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64  r holding an ind
ff00: 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ex record */.  i
ff10: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
ff20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
ff30: 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  lumn counter */.
ff40: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
ff50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ff60: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
ff70: 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
ff80: 6d 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  mn */..  /* Gene
ff90: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
ffa0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
ffb0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
ffc0: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
ffd0: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
ffe0: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
fff0: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
10000 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
10010 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
10020 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
10030 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 72 65 67  t( v!=0 );.  reg
10040 49 73 49 6e 69 74 20 3d 20 2b 2b 70 50 61 72 73  IsInit = ++pPars
10050 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61 64 64 72 49  e->nMem;.  addrI
10060 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
10070 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
10080 2c 20 72 65 67 49 73 49 6e 69 74 29 3b 0a 20 20  , regIsInit);.  
10090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
100b0 20 31 2c 20 72 65 67 49 73 49 6e 69 74 29 3b 0a   1, regIsInit);.
100c0 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
100d0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
100e0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
100f0 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
10100 78 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  x */.  nColumn =
10110 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
10120 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
10130 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
10140 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72  C->nTerm];.  for
10150 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
10160 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
10170 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
10180 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10190 3d 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 0a  ==pSrc->iCursor.
101a0 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
101b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
101c0 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20  notReady)==0.   
101d0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
101e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
101f0 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )!=0.       && s
10200 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
10210 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78  ityOk(pTerm->pEx
10220 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
10250 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
10260 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 29  olumn].affinity)
10270 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 43  .    ){.      nC
10280 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  olumn++;.    }. 
10290 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
102a0 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76  lumn>0 );.  pLev
102b0 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  el->plan.nEq = n
102c0 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4c 65 76 65 6c  Column;.  pLevel
102d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
102e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
102f0 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20   | WO_EQ;..  /* 
10300 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
10310 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
10320 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
10330 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
10340 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
10350 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
10360 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
10370 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
10380 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
10390 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
103a0 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
103b0 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
103c0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
103d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
103e0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
103f0 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
10400 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
10410 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
10420 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
10430 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
10440 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
10450 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
10460 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
10470 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31   (char**)&pIdx[1
10480 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ];.  pIdx->aiCol
10490 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64  umn = (int*)&pId
104a0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d  x->azColl[nColum
104b0 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n];.  pIdx->aSor
104c0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
104d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  Idx->aiColumn[nC
104e0 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
104f0 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
10500 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  dex";.  pIdx->nC
10510 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  olumn = nColumn;
10520 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
10530 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
10540 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
10550 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
10560 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
10570 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
10580 66 74 43 75 72 73 6f 72 3d 3d 70 53 72 63 2d 3e  ftCursor==pSrc->
10590 69 43 75 72 73 6f 72 0a 20 20 20 20 20 20 20 26  iCursor.       &
105a0 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
105b0 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
105c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )==0.       && (
105d0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
105e0 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20   & WO_EQ)!=0.   
105f0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 6e      && sqlite3In
10600 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
10610 65 72 6d 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20  erm->pExpr,.    
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
10640 62 6c 65 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d  ble->aCol[pTerm-
10650 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61  >u.leftColumn].a
10660 66 66 69 6e 69 74 79 29 0a 20 20 20 20 29 7b 0a  ffinity).    ){.
10670 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10680 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
10690 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 45 78 70 72  lumn;.      Expr
106a0 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 49 64 78   *pX;.      pIdx
106b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
106c0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 58 20 3d  iCol;.      pX =
106d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
106e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
106f0 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
10700 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
10710 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
10720 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70  pRight);.      p
10730 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
10740 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
10750 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
10760 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
10770 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
10780 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
10790 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
107a0 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f  ex */.  pKeyinfo
107b0 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
107c0 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
107d0 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Idx);.  assert( 
107e0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
107f0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
10800 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10810 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
10820 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
10830 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20  nColumn+1, 0,.  
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66    (char*)pKeyinf
10860 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
10870 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f  NDOFF);.  VdbeCo
10880 6d 6d 65 6e 74 28 28 76 2c 20 22 61 75 74 6f 2d  mment((v, "auto-
10890 69 64 78 20 66 6f 72 20 25 73 22 2c 20 70 54 61  idx for %s", pTa
108a0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
108b0 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 74 72 61   /* Fill the tra
108c0 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 77 69 74  nsient index wit
108d0 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61  h content */.  a
108e0 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
108f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10900 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d  _Rewind, pLevel-
10910 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65 67  >iTabCur);.  reg
10920 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
10930 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10940 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  e);.  sqlite3Gen
10950 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
10960 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76  arse, pIdx, pLev
10970 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67  el->iTabCur, reg
10980 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71  Record, 1);.  sq
10990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
109a0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
109b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
109c0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
109d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
109e0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
109f0 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
10a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a10 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
10a20 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
10a30 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c  ddrTop+1);.  sql
10a40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10a50 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
10a60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10a70 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
10a80 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
10a90 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
10aa0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
10ab0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
10ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10ad0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
10ae0 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
10af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10b00 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c  ALTABLE./*.** Al
10b10 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
10b20 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ate an sqlite3_i
10b30 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10b40 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ure. It is the .
10b50 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
10b60 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
10b70 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
10b80 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74  lease the struct
10b90 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e  ure.** by passin
10ba0 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65  g the pointer re
10bb0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
10bc0 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74  unction to sqlit
10bd0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
10be0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64  atic sqlite3_ind
10bf0 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74  ex_info *allocat
10c00 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61  eIndexInfo(.  Pa
10c10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
10c20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
10c30 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
10c40 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
10c50 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10c60 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
10c70 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
10c80 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
10c90 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
10ca0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
10cb0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
10cc0 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
10cd0 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
10ce0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
10cf0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
10d00 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
10d10 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
10d20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
10d30 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10d40 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
10d50 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 52    WHERETRACE(("R
10d60 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78  ecomputing index
10d70 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c   info for %s...\
10d80 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  n", pSrc->pTab->
10d90 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43  zName));..  /* C
10da0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
10db0 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
10dc0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
10dd0 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
10de0 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
10df0 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ual table */.  f
10e00 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54  or(i=nTerm=0, pT
10e10 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
10e20 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
10e30 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
10e40 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
10e50 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
10e60 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
10e70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
10e80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
10e90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
10ea0 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  1))==0 );.    te
10eb0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
10ec0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
10ed0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10ee0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
10ef0 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  r==WO_ISNULL );.
10f00 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
10f10 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
10f20 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63  N|WO_ISNULL) ) c
10f30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
10f40 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
10f50 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
10f60 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
10f70 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
10f80 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
10f90 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
10fa0 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
10fb0 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
10fc0 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
10fd0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
10fe0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
10ff0 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
11000 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
11010 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
11020 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
11030 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
11040 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
11050 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
11060 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
11070 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
11080 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
11090 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
110a0 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
110b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
110c0 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45   i==pOrderBy->nE
110d0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f 72  xpr ){.      nOr
110e0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
110f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20  ->nExpr;.    }. 
11100 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
11110 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
11120 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
11130 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
11140 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
11150 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
11160 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
11170 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
111a0 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
111b0 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
111e0 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
111f0 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
11200 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
11210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11220 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11230 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
11240 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29  .    /* (double)
11250 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  0 In case of SQL
11260 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
11270 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
11280 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11290 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
112a0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
112b0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
112c0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
112d0 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20  e contains.  ** 
112e0 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
112f0 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
11300 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
11310 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
11320 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  .  ** changing t
11330 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
11340 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
11350 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
11360 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  to.  ** initiali
11370 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e  ze those fields.
11380 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
11390 20 3d 20 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 29 26 70 49 64 78 49 6e 66 6f 5b 31  int*)&pIdxInfo[1
113c0 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42 79  ];.  pIdxOrderBy
113d0 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74   = (struct sqlit
113e0 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
113f0 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72  *)&pIdxCons[nTer
11400 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 28  m];.  pUsage = (
11410 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11420 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
11430 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
11440 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
11450 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
11460 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
11470 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a   nTerm;.  *(int*
11480 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
11490 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
114a0 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
114b0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
114c0 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
114d0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
114e0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74  pIdxCons;.  *(st
114f0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
11500 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49  ex_orderby**)&pI
11510 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
11520 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a   = pIdxOrderBy;.
11530 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
11540 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
11550 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
11560 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
11570 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 73               pUs
115c0 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  age;..  for(i=j=
115d0 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
115e0 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
115f0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
11600 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
11610 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
11620 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
11630 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
11640 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
11650 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  or&(pTerm->eOper
11660 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  ator-1))==0 );. 
11670 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
11680 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
11690 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
116a0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
116b0 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c  erator==WO_ISNUL
116c0 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  L );.    if( pTe
116d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
116e0 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_IN|WO_ISNULL
116f0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
11700 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43    pIdxCons[j].iC
11710 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75  olumn = pTerm->u
11720 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
11730 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65   pIdxCons[j].iTe
11740 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  rmOffset = i;.  
11750 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
11760 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
11770 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a 20  perator;.    /* 
11780 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69 67  The direct assig
11790 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65  nment in the pre
117a0 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f  vious line is po
117b0 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61  ssible only beca
117c0 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57  use.    ** the W
117d0 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e  O_ and SQLITE_IN
117e0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20  DEX_CONSTRAINT_ 
117f0 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69  codes are identi
11800 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  cal.  The.    **
11810 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
11820 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
11830 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  act. */.    asse
11840 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54  rt( WO_EQ==SQLIT
11850 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
11860 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  NT_EQ );.    ass
11870 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
11880 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
11890 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73  INT_LT );.    as
118a0 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c  sert( WO_LE==SQL
118b0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
118c0 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61  AINT_LE );.    a
118d0 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
118e0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
118f0 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
11900 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
11910 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
11920 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
11930 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43   assert( WO_MATC
11940 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  H==SQLITE_INDEX_
11950 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
11960 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11970 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11980 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c   & (WO_EQ|WO_LT|
11990 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
119a0 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
119b0 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
119c0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
119d0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
119e0 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
119f0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
11a00 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
11a10 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
11a20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
11a30 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
11a40 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
11a50 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11a60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11a70 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
11a80 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
11a90 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
11aa0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11ab0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
11ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
11ad0 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
11ae0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
11af0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
11b00 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
11b10 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
11b20 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
11b30 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
11b40 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
11b50 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  o pointer passed
11b60 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75 6d  .** as the argum
11b70 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
11b80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70   error occurs, p
11b90 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74  Parse is populat
11ba0 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
11bb0 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a   message and a.*
11bc0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
11bd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
11be0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
11bf0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f  turned and the o
11c00 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66  utput.** part of
11c10 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
11c20 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
11c30 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61  e is left popula
11c40 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  ted..**.** Wheth
11c50 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
11c60 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
11c70 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
11c80 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
11c90 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
11ca0 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e  ntually free p->
11cb0 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65  idxStr if p->nee
11cc0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e  dToFreeIdxStr in
11cd0 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20  dicates.** that 
11ce0 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  this is required
11cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d00 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50 61  vtabBestIndex(Pa
11d10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
11d20 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65  le *pTab, sqlite
11d30 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
11d40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
11d50 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65   *pVtab = sqlite
11d60 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
11d70 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56  e->db, pTab)->pV
11d80 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tab;.  int i;.  
11d90 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48 45 52 45  int rc;..  WHERE
11da0 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64  TRACE(("xBestInd
11db0 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54  ex for %s\n", pT
11dc0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54  ab->zName));.  T
11dd0 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
11de0 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
11df0 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
11e00 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
11e10 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
11e20 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
11e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11e50 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
11e60 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
11e70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
11e80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
11e90 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
11ea0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11eb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11ec0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
11ed0 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65  Str(rc));.    }e
11ee0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
11ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11f00 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e  e, "%s", pVtab->
11f10 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
11f20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
11f30 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
11f40 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
11f50 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
11f60 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
11f70 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
11f80 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
11f90 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
11fa0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
11fb0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
11fc0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
11fd0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
11fe0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11ff0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
12000 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
12010 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
12020 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
12030 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
12040 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
12050 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
12060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
12070 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
12080 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74   for a virtual t
12090 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
120a0 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f  best index is co
120b0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42  mputed by the xB
120c0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
120d0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  of the virtual.*
120e0 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20  * table module. 
120f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12100 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77   really just a w
12110 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73  rapper that sets
12120 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   up.** the sqlit
12130 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
12140 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
12150 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  used to communic
12160 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73  ate with.** xBes
12170 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e  tIndex..**.** In
12180 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f   a join, this ro
12190 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63  utine might be c
121a0 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  alled multiple t
121b0 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  imes for the.** 
121c0 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62  same virtual tab
121d0 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  le.  The sqlite3
121e0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
121f0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
12200 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
12210 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74  zed on the first
12220 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
12230 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75  reused on all su
12240 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f  bsequent.** invo
12250 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71  cations.  The sq
12260 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12270 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
12280 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  so used when.** 
12290 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
122a0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
122b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
122c0 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c  The whereInfoDel
122d0 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e  ete() .** routin
122e0 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  e takes care of 
122f0 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69  freeing the sqli
12300 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12310 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a  tructure after.*
12320 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20  * everybody has 
12330 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74  finished with it
12340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12350 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
12360 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12370 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12380 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
12390 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
123a0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
123b0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
123c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
123d0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
123e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
123f0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Src,      /* The
12400 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
12410 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
12420 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12430 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
12440 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
12450 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
12460 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
12470 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12480 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  By,             
12490 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20  /* The order by 
124a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
124b0 65 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20 20  eCost *pCost,   
124c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
124d0 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
124e0 20 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74   plan */.  sqlit
124f0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
12500 70 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e  ppIdxInfo  /* In
12510 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  dex information 
12520 70 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49  passed to xBestI
12530 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ndex */.){.  Tab
12540 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d  le *pTab = pSrc-
12550 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
12560 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
12570 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
12580 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
12590 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
125a0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
125b0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
125c0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
125d0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
125e0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
125f0 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
12600 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43  rBy;.  double rC
12610 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ost;..  /* Make 
12620 73 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20  sure wsFlags is 
12630 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73  initialized to s
12640 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20  ome sane value. 
12650 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
12660 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69  e .  ** malloc i
12670 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  n allocateIndexI
12680 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20  nfo() fails and 
12690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
126a0 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20  turns leaving.  
126b0 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e  ** wsFlags in an
126c0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
126d0 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72  tate, the caller
126e0 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72   may behave unpr
126f0 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a  edictably..  */.
12700 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20    memset(pCost, 
12710 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  0, sizeof(*pCost
12720 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61  ));.  pCost->pla
12730 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
12740 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
12750 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
12760 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12770 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
12780 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
12790 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
127a0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
127b0 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  , then allocate 
127c0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
127d0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49  t now..  */.  pI
127e0 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49  dxInfo = *ppIdxI
127f0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nfo;.  if( pIdxI
12800 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  nfo==0 ){.    *p
12810 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49  pIdxInfo = pIdxI
12820 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
12830 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
12840 70 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64 65  pWC, pSrc, pOrde
12850 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rBy);.  }.  if( 
12860 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
12870 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
12880 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
12890 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nt, the sqlite3_
128a0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
128b0 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e  ture that pIdxIn
128c0 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74  fo points.  ** t
128d0 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  o will have been
128e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69   initialized, ei
128f0 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20  ther during the 
12900 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
12910 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e  on or.  ** durin
12920 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76  g some prior inv
12930 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65  ocation.  Now we
12940 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75   just have to cu
12950 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a  stomize the.  **
12960 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78   details of pIdx
12970 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72  Info for the cur
12980 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
12990 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20  and pass it to. 
129a0 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   ** xBestIndex..
129b0 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    */..  /* The m
129c0 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  odule name must 
129d0 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f  be defined. Also
129e0 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20  , by this point 
129f0 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20  there must.  ** 
12a00 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
12a10 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
12a20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72  structure. Other
12a30 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  wise.  ** sqlite
12a40 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
12a50 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65  mes() would have
12a60 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65   picked up the e
12a70 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  rror. .  */.  as
12a80 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f  sert( pTab->azMo
12a90 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d  duleArg && pTab-
12aa0 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20  >azModuleArg[0] 
12ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12ac0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
12ad0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 20  arse->db, pTab) 
12ae0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
12af0 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
12b00 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
12b10 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
12b20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  .  ** output var
12b30 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a  iables to zero..
12b40 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74    **.  ** aConst
12b50 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69  raint[].usable i
12b60 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74  s true for const
12b70 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65  raints where the
12b80 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a   right-hand.  **
12b90 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
12ba0 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
12bb0 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
12bc0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
12bd0 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
12be0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12bf0 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
12c00 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
12c10 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
12c20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20         column = 
12c30 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  expr.  **.  ** a
12c40 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  nd we are evalua
12c50 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65  ting a join, the
12c60 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
12c70 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20   on column is . 
12c80 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
12c90 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
12ca0 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
12cb0 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
12cc0 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  t.  ** of the ta
12cd0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
12ce0 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  olumn..  **.  **
12cf0 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
12d00 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  s[] array contai
12d10 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
12d20 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ll constraints. 
12d30 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65   ** on the curre
12d40 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20  nt table.  That 
12d50 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65  way we only have
12d60 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f   to compute it o
12d70 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  nce.  ** even th
12d80 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72  ough we might tr
12d90 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65  y to pick the be
12da0 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c  st index multipl
12db0 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f  e times..  ** Fo
12dc0 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
12dd0 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
12de0 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
12df0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
12e00 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62   ** join might b
12e10 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77  e different so w
12e20 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70  e have to recomp
12e30 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66  ute the usable f
12e40 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69  lag.  ** each ti
12e50 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  me..  */.  pIdxC
12e60 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
12e70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
12e80 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
12e90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
12ea0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
12eb0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
12ec0 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
12ed0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
12ee0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
12ef0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
12f00 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
12f10 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
12f20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
12f30 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
12f40 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
12f50 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
12f60 26 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a  &notReady) ? 0 :
12f70 20 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   1;.  }.  memset
12f80 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
12f90 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
12fa0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
12fb0 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78  int);.  if( pIdx
12fc0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
12fd0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71  IdxStr ){.    sq
12fe0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
12ff0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
13000 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  }.  pIdxInfo->id
13010 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
13020 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
13030 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  ;.  pIdxInfo->ne
13040 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
13050 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
13060 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
13070 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62  = 0;.  /* ((doub
13080 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66  le)2) In case of
13090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
130a0 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
130b0 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  /.  pIdxInfo->es
130c0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
130d0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
130e0 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f  (double)2);.  nO
130f0 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66  rderBy = pIdxInf
13100 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  o->nOrderBy;.  i
13110 66 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b 0a  f( !pOrderBy ){.
13120 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
13130 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
13140 0a 20 20 69 66 28 20 76 74 61 62 42 65 73 74 49  .  if( vtabBestI
13150 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
13160 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a  b, pIdxInfo) ){.
13170 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13180 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
13190 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
131a0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
131b0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
131c0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
131d0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
131e0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
131f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61  +){.    if( pUsa
13200 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
13210 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74  0 ){.      pCost
13220 2d 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61  ->used |= pWC->a
13230 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65  [pIdxCons[i].iTe
13240 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71  rmOffset].prereq
13250 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
13260 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
13270 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
13280 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73  lause, and the s
13290 65 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20  elected virtual 
132a0 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a  table index.  **
132b0 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66   does not satisf
132c0 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74  y it, increase t
132d0 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
132e0 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  can accordingly.
132f0 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68   This.  ** match
13300 65 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  es the processin
13310 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61  g for non-virtua
13320 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74  l tables in best
13330 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20  BtreeIndex()..  
13340 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64  */.  rCost = pId
13350 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
13360 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64  Cost;.  if( pOrd
13370 65 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f  erBy && pIdxInfo
13380 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
13390 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73  d==0 ){.    rCos
133a0 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73  t += estLog(rCos
133b0 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20  t)*rCost;.  }.. 
133c0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20   /* The cost is 
133d0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
133e0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  e larger than SQ
133f0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68  LITE_BIG_DBL (th
13400 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61  e.  ** inital va
13410 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73  lue of lowestCos
13420 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20  t in this loop. 
13430 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  If it is, then t
13440 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f  he.  ** (cost<lo
13450 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62  westCost) test b
13460 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20  elow will never 
13470 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20  be true..  ** . 
13480 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65   ** Use "(double
13490 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  )2" instead of "
134a0 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49  2.0" in case OMI
134b0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
134c0 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65   .  ** is define
134d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53  d..  */.  if( (S
134e0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
134f0 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74  double)2))<rCost
13500 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72   ){.    pCost->r
13510 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42  Cost = (SQLITE_B
13520 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29  IG_DBL/((double)
13530 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2));.  }else{.  
13540 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
13550 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 43   rCost;.  }.  pC
13560 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  ost->plan.u.pVta
13570 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b  bIdx = pIdxInfo;
13580 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
13590 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
135a0 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70   ){.    pCost->p
135b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
135c0 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
135d0 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  }.  pCost->plan.
135e0 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  nEq = 0;.  pIdxI
135f0 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
13600 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  nOrderBy;..  /* 
13610 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f  Try to find a mo
13620 72 65 20 65 66 66 69 63 69 65 6e 74 20 61 63 63  re efficient acc
13630 65 73 73 20 70 61 74 74 65 72 6e 20 62 79 20 75  ess pattern by u
13640 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e  sing multiple in
13650 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70  dexes.  ** to op
13660 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70  timize an OR exp
13670 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74  ression within t
13680 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
13690 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43   .  */.  bestOrC
136a0 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73  lauseIndex(pPars
136b0 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
136c0 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
136d0 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64  , pCost);.}.#end
136e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
136f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
13700 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  /../*.** Argumen
13710 74 20 70 49 64 78 20 69 73 20 61 20 70 6f 69 6e  t pIdx is a poin
13720 74 65 72 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ter to an index 
13730 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
13740 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a  as an array of.*
13750 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  * SQLITE_INDEX_S
13760 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79 20 73 70  AMPLES evenly sp
13770 61 63 65 64 20 73 61 6d 70 6c 65 73 20 6f 66 20  aced samples of 
13780 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 65  the first indexe
13790 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72  d column.** stor
137a0 65 64 20 69 6e 20 49 6e 64 65 78 2e 61 53 61 6d  ed in Index.aSam
137b0 70 6c 65 2e 20 54 68 65 20 64 6f 6d 61 69 6e 20  ple. The domain 
137c0 6f 66 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  of values stored
137d0 20 69 6e 20 73 61 69 64 20 63 6f 6c 75 6d 6e 0a   in said column.
137e0 2a 2a 20 6d 61 79 20 62 65 20 74 68 6f 75 67 68  ** may be though
137f0 74 20 6f 66 20 61 73 20 64 69 76 69 64 65 64 20  t of as divided 
13800 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e 44  into (SQLITE_IND
13810 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72 65  EX_SAMPLES+1) re
13820 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e  gions..** Region
13830 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20   0 contains all 
13840 76 61 6c 75 65 73 20 73 6d 61 6c 6c 65 72 20 74  values smaller t
13850 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 73 61  han the first sa
13860 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67 69  mple value. Regi
13870 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e 73  on.** 1 contains
13880 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20 74   values larger t
13890 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
138a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
138b0 20 66 69 72 73 74 20 73 61 6d 70 6c 65 2c 0a 2a   first sample,.*
138c0 2a 20 62 75 74 20 73 6d 61 6c 6c 65 72 20 74 68  * but smaller th
138d0 61 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  an the value of 
138e0 74 68 65 20 73 65 63 6f 6e 64 2e 20 41 6e 64 20  the second. And 
138f0 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  so on..**.** If 
13900 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
13910 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
13920 69 6e 65 73 20 77 68 69 63 68 20 6f 66 20 74 68  ines which of th
13930 65 20 72 65 67 69 6f 6e 73 20 76 61 6c 75 65 20  e regions value 
13940 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73 20 69 6e  .** pVal lies in
13950 2c 20 73 65 74 73 20 2a 70 69 52 65 67 69 6f 6e  , sets *piRegion
13960 20 74 6f 20 74 68 65 20 72 65 67 69 6f 6e 20 69   to the region i
13970 6e 64 65 78 20 28 61 20 76 61 6c 75 65 20 62 65  ndex (a value be
13980 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53  tween 0.** and S
13990 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
139a0 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65  LES+1, inclusive
139b0 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  ) and returns SQ
139c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
139d0 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  if an OOM occurs
139e0 20 77 68 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e   while convertin
139f0 67 20 74 65 78 74 20 76 61 6c 75 65 73 20 62 65  g text values be
13a00 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c  tween encodings,
13a10 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
13a20 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
13a30 20 2a 70 69 52 65 67 69 6f 6e 20 69 73 20 75 6e   *piRegion is un
13a40 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64  defined..*/.#ifd
13a50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13a60 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e  _STAT2.static in
13a70 74 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  t whereRangeRegi
13a80 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
13a90 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
13aa0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13ab0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
13ac0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
13ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13ae0 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
13af0 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71  omain of */.  sq
13b00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
13b10 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l,        /* Val
13b20 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  ue to consider *
13b30 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65 67 69 6f  /.  int *piRegio
13b40 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
13b50 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f  /* OUT: Region o
13b60 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63  f domain in whic
13b70 68 20 76 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a  h value lies */.
13b80 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
13b90 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  pVal) ){.    Ind
13ba0 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
13bb0 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
13bc0 65 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  e;.    int i = 0
13bd0 3b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 20  ;.    int eType 
13be0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13bf0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 20  type(pVal);..   
13c00 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
13c10 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54  TE_INTEGER || eT
13c20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
13c30 54 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  T ){.      doubl
13c40 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
13c50 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
13c60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13c70 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   i<SQLITE_INDEX_
13c80 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20  SAMPLES; i++){. 
13c90 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
13ca0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
13cb0 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
13cc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
13cd0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
13ce0 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e>=SQLITE_TEXT |
13cf0 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  | aSample[i].u.r
13d00 3e 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >r ) break;.    
13d10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 20 0a    }.    }else{ .
13d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
13d30 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13d40 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
13d50 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
13d60 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
13d70 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt n;..      /* 
13d80 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f 6d 20  pVal comes from 
13d90 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
13da0 45 78 70 72 28 29 20 73 6f 20 74 68 65 20 74 79  Expr() so the ty
13db0 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  pe cannot be NUL
13dc0 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  L */.      asser
13dd0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
13de0 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d  _TEXT || eType==
13df0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a  SQLITE_BLOB );..
13e00 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
13e10 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
13e20 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
13e30 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f  st u8 *)sqlite3_
13e40 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
13e50 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
13e60 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13e70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13e80 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c   pColl->enc==SQL
13e90 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20  ITE_UTF8 );.    
13ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13eb0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13ec0 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  GetCollSeq(db, S
13ed0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
13ee0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
13ef0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
13f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13f10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13f20 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
13f30 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
13f40 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20 20 20  ence: %s",.     
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f       *pIdx->azCo
13f70 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ll);.          r
13f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13f90 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
13fa0 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
13fb0 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c   u8 *)sqlite3Val
13fc0 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f  ueText(pVal, pCo
13fd0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20  ll->enc);.      
13fe0 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20    if( !z ){.    
13ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14000 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
14020 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20  ert( z && pColl 
14030 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14050 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  n = sqlite3Value
14060 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c  Bytes(pVal, pCol
14070 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20 20 20  l->enc);..      
14080 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
14090 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
140a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
140b0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt r;.        in
140c0 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20  t eSampletype = 
140d0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
140e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53  ;.        if( eS
140f0 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c 49 54  ampletype==SQLIT
14100 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c  E_NULL || eSampl
14110 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
14120 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14130 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79 70 65  if( (eSampletype
14140 21 3d 65 54 79 70 65 29 20 29 20 62 72 65 61 6b  !=eType) ) break
14150 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14160 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
14170 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65      if( pColl->e
14180 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
14190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
141a0 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20   nSample;.      
141b0 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c      char *zSampl
141c0 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74  e = sqlite3Utf8t
141d0 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20  o16(.           
141e0 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e     db, pColl->en
141f0 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  c, aSample[i].u.
14200 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  z, aSample[i].nB
14210 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20  yte, &nSample.  
14220 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
14230 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c       if( !zSampl
14240 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14250 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
14260 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14270 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
142a0 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d 3e 78      r = pColl->x
142b0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
142c0 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70  , nSample, zSamp
142d0 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  le, n, z);.     
142e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
142f0 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b  ee(db, zSample);
14300 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
14310 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
14320 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 70 43            r = pC
14330 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
14340 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b  >pUser, aSample[
14350 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c  i].nByte, aSampl
14360 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b  e[i].u.z, n, z);
14370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14380 20 20 20 69 66 28 20 72 3e 30 20 29 20 62 72 65     if( r>0 ) bre
14390 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
143a0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  }..    assert( i
143b0 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c 49 54 45  >=0 && i<=SQLITE
143c0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
143d0 3b 0a 20 20 20 20 2a 70 69 52 65 67 69 6f 6e 20  ;.    *piRegion 
143e0 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
143f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
14400 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 66 64 65  endif   /* #ifde
14410 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14420 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT2 */../*.** 
14430 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
14440 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
14450 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
14460 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
14470 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
14480 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
14490 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
144a0 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
144b0 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
144c0 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
144d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
144e0 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
144f0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14500 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
14510 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14520 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
14530 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
14540 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
14550 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
14560 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
14570 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
14580 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
14590 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
145a0 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
145b0 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
145c0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
145d0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
145e0 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
145f0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
14600 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
14610 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
14620 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
14630 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
14640 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
14650 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
14660 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
14670 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
14680 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
14690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
146a0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
146b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
146c0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
146d0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
146e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
146f0 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT2.static int 
14700 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
14710 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14720 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
14730 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
14740 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
14750 0a 29 7b 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  .){.  /* The eva
14760 6c 43 6f 6e 73 74 45 78 70 72 28 29 20 66 75 6e  lConstExpr() fun
14770 63 74 69 6f 6e 20 77 69 6c 6c 20 68 61 76 65 20  ction will have 
14780 61 6c 72 65 61 64 79 20 63 6f 6e 76 65 72 74 65  already converte
14790 64 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  d any TK_VARIABL
147a0 45 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  E.  ** expressio
147b0 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 61 6e  n involved in an
147c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 74 6f   comparison into
147d0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20   a TK_REGISTER. 
147e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
147f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 56 41 52 49 41  pr->op!=TK_VARIA
14800 42 4c 45 20 29 3b 0a 20 20 69 66 28 20 70 45 78  BLE );.  if( pEx
14810 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
14820 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
14830 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  2==TK_VARIABLE )
14840 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d  {.    int iVar =
14850 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
14860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14870 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
14880 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b  e->pVdbe, iVar);
14890 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74  .    *pp = sqlit
148a0 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 70  e3VdbeGetValue(p
148b0 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
148c0 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b 0a 20  e, iVar, aff);. 
148d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
148e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
148f0 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  n sqlite3ValueFr
14900 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  omExpr(pParse->d
14910 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54 45  b, pExpr, SQLITE
14920 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70 29 3b  _UTF8, aff, pp);
14930 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14950 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
14960 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
14970 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
14980 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
14990 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
149a0 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
149b0 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
149c0 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
149d0 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
149e0 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
149f0 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
14a00 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
14a10 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
14a20 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
14a30 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
14a40 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
14a50 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
14a60 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
14a70 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
14a80 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
14a90 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
14aa0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
14ab0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
14ac0 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
14af0 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
14b00 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
14b10 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
14b30 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
14b40 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
14b50 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
14b60 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
14b70 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
14b80 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
14b90 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
14ba0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
14bb0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
14bc0 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d 65 74   The nEq paramet
14bd0 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
14be0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 6e   index of the in
14bf0 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  dex column subje
14c00 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72 61 6e  ct to the.** ran
14c10 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f  ge constraint. O
14c20 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c  r, equivalently,
14c30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
14c40 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
14c50 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64  nts.** optimized
14c60 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64   by the proposed
14c70 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72   index scan. For
14c80 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
14c90 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a 2a 2a  ng index p is.**
14ca0 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e   on t1(a, b), an
14cb0 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20  d the SQL query 
14cc0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
14cd0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
14ce0 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e  = ? AND b > ? AN
14cf0 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D b < ? ....**.*
14d00 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c  * then nEq shoul
14d10 64 20 62 65 20 70 61 73 73 65 64 20 74 68 65 20  d be passed the 
14d20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68 65 20  value 1 (as the 
14d30 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
14d40 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c 20 69   column,.** b, i
14d50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66  s the second lef
14d60 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
14d70 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c   the index). Or,
14d80 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
14d90 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
14da0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20  OM t1 WHERE a > 
14db0 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a  ? AND a < ? ....
14dc0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73  **.** then nEq s
14dd0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
14de0 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  0..**.** The ret
14df0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 61  urned value is a
14e00 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
14e10 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69 6e 63  n 1 and 100, inc
14e20 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75 72 6e  lusive. A return
14e30 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31 20 69  .** value of 1 i
14e40 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
14e50 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e 67 65  e proposed range
14e60 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
14e70 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20 61 70  d to visit.** ap
14e80 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f 31 30  proximately 1/10
14e90 30 74 68 20 28 31 25 29 20 6f 66 20 74 68 65 20  0th (1%) of the 
14ea0 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20 62 79  rows selected by
14eb0 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
14ec0 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73  y.** constraints
14ed0 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72 65 74   (if any). A ret
14ee0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31 30 30  urn value of 100
14ef0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
14f00 69 74 20 69 73 20 65 78 70 65 63 74 65 64 0a 2a  it is expected.*
14f10 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e 67 65  * that the range
14f20 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
14f30 20 65 76 65 72 79 20 72 6f 77 20 28 31 30 30 25   every row (100%
14f40 29 20 73 65 6c 65 63 74 65 64 20 62 79 20 74 68  ) selected by th
14f50 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  e equality.** co
14f60 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
14f70 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
14f80 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20  of sqlite_stat2 
14f90 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65 61  ANALYZE data, ea
14fa0 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  ch range inequal
14fb0 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  ity.** reduces t
14fc0 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
14fd0 62 79 20 32 2f 33 72 64 73 2e 20 20 48 65 6e 63  by 2/3rds.  Henc
14fe0 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  e a single const
14ff0 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a 20 72  raint (x>?).** r
15000 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65 74 75  esults in a retu
15010 72 6e 20 6f 66 20 33 33 20 61 6e 64 20 61 20 72  rn of 33 and a r
15020 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
15030 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
15040 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20 72 65  sults.** in a re
15050 74 75 72 6e 20 6f 66 20 31 31 2e 0a 2a 2f 0a 73  turn of 11..*/.s
15060 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
15070 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20 50  angeScanEst(.  P
15080 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15090 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
150a0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
150b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
150c0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
150d0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
150e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
150f0 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f  ange-compared co
15100 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20 69  lumn; "x" */.  i
15110 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20 20  nt nEq,         
15120 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e 74      /* index int
15130 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20 74  o p->aCol[] of t
15140 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
15150 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  d column */.  Wh
15160 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c  ereTerm *pLower,
15170 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e     /* Lower boun
15180 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
15190 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68  ex: "x>123" Migh
151a0 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
151b0 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72  hereTerm *pUpper
151c0 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75  ,   /* Upper bou
151d0 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
151e0 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67   ex: "x<455" Mig
151f0 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
15200 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20 20 20  int *piEst      
15210 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
15220 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  urn value */.){.
15230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15240 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
15250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15260 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  2..  if( nEq==0 
15270 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65 20 29 7b  && p->aSample ){
15280 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
15290 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c 20 3d 20  ue *pLowerVal = 
152a0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  0;.    sqlite3_v
152b0 61 6c 75 65 20 2a 70 55 70 70 65 72 56 61 6c 20  alue *pUpperVal 
152c0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 45 73  = 0;.    int iEs
152d0 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c 6f 77 65  t;.    int iLowe
152e0 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  r = 0;.    int i
152f0 55 70 70 65 72 20 3d 20 53 51 4c 49 54 45 5f 49  Upper = SQLITE_I
15300 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20  NDEX_SAMPLES;.  
15310 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54    u8 aff = p->pT
15320 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
15330 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
15340 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c  ity;..    if( pL
15350 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  ower ){.      Ex
15360 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77  pr *pExpr = pLow
15370 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
15380 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61  t;.      rc = va
15390 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
153a0 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  se, pExpr, aff, 
153b0 26 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20  &pLowerVal);.   
153c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
153d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55 70 70  QLITE_OK && pUpp
153e0 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  er ){.      Expr
153f0 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72   *pExpr = pUpper
15400 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
15410 0a 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75  .      rc = valu
15420 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
15430 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70  , pExpr, aff, &p
15440 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 7d  UpperVal);.    }
15450 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
15460 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c 6f 77  LITE_OK || (pLow
15470 65 72 56 61 6c 3d 3d 30 20 26 26 20 70 55 70 70  erVal==0 && pUpp
15480 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20 20 20  erVal==0) ){.   
15490 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
154a0 72 65 65 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a  ree(pLowerVal);.
154b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
154c0 75 65 46 72 65 65 28 70 55 70 70 65 72 56 61 6c  ueFree(pUpperVal
154d0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 61  );.      goto ra
154e0 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b  nge_est_fallback
154f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15500 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29 7b 0a  pLowerVal==0 ){.
15510 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
15520 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
15530 73 65 2c 20 70 2c 20 70 55 70 70 65 72 56 61 6c  se, p, pUpperVal
15540 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20  , &iUpper);.    
15550 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 20 69    if( pLower ) i
15560 4c 6f 77 65 72 20 3d 20 69 55 70 70 65 72 2f 32  Lower = iUpper/2
15570 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15580 70 55 70 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a  pUpperVal==0 ){.
15590 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
155a0 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
155b0 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c  se, p, pLowerVal
155c0 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20  , &iLower);.    
155d0 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20 69    if( pUpper ) i
155e0 55 70 70 65 72 20 3d 20 28 69 4c 6f 77 65 72 20  Upper = (iLower 
155f0 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  + SQLITE_INDEX_S
15600 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a 20  AMPLES + 1)/2;. 
15610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15620 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52  rc = whereRangeR
15630 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c  egion(pParse, p,
15640 20 70 55 70 70 65 72 56 61 6c 2c 20 26 69 55 70   pUpperVal, &iUp
15650 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  per);.      if( 
15660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
15680 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
15690 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
156a0 56 61 6c 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20  Val, &iLower);. 
156b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
156c0 20 20 69 45 73 74 20 3d 20 69 55 70 70 65 72 20    iEst = iUpper 
156d0 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65  - iLower;.    te
156e0 73 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53 51  stcase( iEst==SQ
156f0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
15700 45 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ES );.    assert
15710 28 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49  ( iEst<=SQLITE_I
15720 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
15730 20 20 20 20 69 66 28 20 69 45 73 74 3c 31 20 29      if( iEst<1 )
15740 7b 0a 20 20 20 20 20 20 69 45 73 74 20 3d 20 31  {.      iEst = 1
15750 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
15760 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c  ite3ValueFree(pL
15770 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71  owerVal);.    sq
15780 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
15790 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 2a  UpperVal);.    *
157a0 70 69 45 73 74 20 3d 20 28 69 45 73 74 20 2a 20  piEst = (iEst * 
157b0 31 30 30 29 2f 53 51 4c 49 54 45 5f 49 4e 44 45  100)/SQLITE_INDE
157c0 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 72  X_SAMPLES;.    r
157d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61  eturn rc;.  }.ra
157e0 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b  nge_est_fallback
157f0 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  :.#else.  UNUSED
15800 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
15810 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
15820 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
15830 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45  SED_PARAMETER(nE
15840 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  q);.#endif.  ass
15850 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70  ert( pLower || p
15860 55 70 70 65 72 20 29 3b 0a 20 20 69 66 28 20 70  Upper );.  if( p
15870 4c 6f 77 65 72 20 26 26 20 70 55 70 70 65 72 20  Lower && pUpper 
15880 29 7b 0a 20 20 20 20 2a 70 69 45 73 74 20 3d 20  ){.    *piEst = 
15890 31 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  11;.  }else{.   
158a0 20 2a 70 69 45 73 74 20 3d 20 33 33 3b 0a 20 20   *piEst = 33;.  
158b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
158c0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  .../*.** Find th
158d0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
158e0 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72   accessing a par
158f0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
15900 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73  Write the.** bes
15910 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64  t query plan and
15920 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74   its cost into t
15930 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a  he WhereCost obj
15940 65 63 74 20 73 75 70 70 6c 69 65 64 20 61 73 20  ect supplied as 
15950 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61  the.** last para
15960 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
15970 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61   lowest cost pla
15980 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73  n wins.  The cos
15990 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  t is an estimate
159a0 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   of the amount o
159b0 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73  f.** CPU and dis
159c0 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72  k I/O need to pr
159d0 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
159e0 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65  t using the sele
159f0 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61  cted plan..** Fa
15a00 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
15a10 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
15a20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
15a30 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
15a40 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
15a50 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
15a60 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
15a70 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
15a80 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
15a90 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
15aa0 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
15ab0 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
15ac0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
15ad0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
15ae0 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
15af0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
15b00 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
15b10 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
15b20 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
15b30 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
15b40 75 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65  use (pSrc->pInde
15b50 78 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  x) attached to t
15b60 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  he table in.** t
15b70 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
15b80 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
15b90 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  tion only consid
15ba0 65 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20  ers plans using 
15bb0 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e  the .** named in
15bc0 64 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  dex. If no such 
15bd0 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  plan is found, t
15be0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
15bf0 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49   cost is.** SQLI
15c00 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61  TE_BIG_DBL. If a
15c10 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74   plan is found t
15c20 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d  hat uses the nam
15c30 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68  ed index, .** th
15c40 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63  en the cost is c
15c50 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65  alculated in the
15c60 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a   usual way..**.*
15c70 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58  * If a NOT INDEX
15c80 45 44 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d  ED clause (pSrc-
15c90 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30 29 20  >notIndexed!=0) 
15ca0 77 61 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  was attached to 
15cb0 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e  the table .** in
15cc0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15cd0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69  ement, then no i
15ce0 6e 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73 69  ndexes are consi
15cf0 64 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  dered. However, 
15d00 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64  the .** selected
15d10 20 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20   plan may still 
15d20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
15d30 66 20 74 68 65 20 74 61 62 6c 65 73 20 62 75 69  f the tables bui
15d40 6c 74 2d 69 6e 20 72 6f 77 69 64 0a 2a 2a 20 69  lt-in rowid.** i
15d50 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
15d60 76 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e  void bestBtreeIn
15d70 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
15d80 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
15d90 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
15da0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
15db0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
15dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15dd0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
15de0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
15df0 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
15e00 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
15e10 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
15e20 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
15e30 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
15e40 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
15e50 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
15e60 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
15e70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
15e80 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
15e90 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
15ea0 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
15eb0 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
15ec0 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
15ed0 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
15ee0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
15ef0 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
15f00 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
15f10 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
15f20 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
15f30 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
15f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15f50 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
15f60 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
15f70 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f90 20 43 6f 70 79 20 6f 66 20 70 50 72 6f 62 65 2c   Copy of pProbe,
15fa0 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20 49 50 4b   or zero for IPK
15fb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
15fc0 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20  eqTermMask;     
15fd0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
15fe0 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64  nt mask of valid
15ff0 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74   equality operat
16000 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ors */.  int idx
16010 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20  EqTermMask;     
16020 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6d 61       /* Index ma
16030 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
16040 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
16050 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
16080 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
16090 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
160a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 61 69 52  unsigned int aiR
160b0 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 2f 2a 20 54  owEstPk[2]; /* T
160c0 68 65 20 61 69 52 6f 77 45 73 74 5b 5d 20 76 61  he aiRowEst[] va
160d0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
160e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  index */.  int a
160f0 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
16100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
16110 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
16120 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
16130 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 4d  */.  int wsFlagM
16140 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
16150 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66 6c 61 67   /* Allowed flag
16160 73 20 69 6e 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  s in pCost->plan
16170 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20 20 2f 2a  .wsFlag */..  /*
16180 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
16190 63 6f 73 74 20 74 6f 20 61 20 77 6f 72 73 74 2d  cost to a worst-
161a0 63 61 73 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  case value */.  
161b0 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c  memset(pCost, 0,
161c0 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29   sizeof(*pCost))
161d0 3b 0a 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74  ;.  pCost->rCost
161e0 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
161f0 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  L;..  /* If the 
16200 70 53 72 63 20 74 61 62 6c 65 20 69 73 20 74 68  pSrc table is th
16210 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
16220 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
16230 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a  n we may not.  *
16240 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74  * use an index t
16250 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c  o satisfy IS NUL
16260 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  L constraints on
16270 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68   that table.  Th
16280 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75  is is.  ** becau
16290 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74  se columns might
162a0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55   end up being NU
162b0 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  LL if the table 
162c0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d  does not match -
162d0 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74  .  ** a circumst
162e0 61 6e 63 65 20 77 68 69 63 68 20 74 68 65 20 69  ance which the i
162f0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70  ndex cannot help
16300 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54   us discover.  T
16310 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a  icket #2177..  *
16320 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6a 6f  /.  if( pSrc->jo
16330 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
16340 20 29 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72   ){.    idxEqTer
16350 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
16360 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _IN;.  }else{.  
16370 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20    idxEqTermMask 
16380 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
16390 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20  _ISNULL;.  }..  
163a0 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  if( pSrc->pIndex
163b0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e   ){.    /* An IN
163c0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
163d0 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74  specifies a part
163e0 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20  icular index to 
163f0 75 73 65 20 2a 2f 0a 20 20 20 20 70 49 64 78 20  use */.    pIdx 
16400 3d 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d  = pProbe = pSrc-
16410 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 73 46  >pIndex;.    wsF
16420 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52  lagMask = ~(WHER
16430 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
16440 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
16450 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
16460 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20  idxEqTermMask;. 
16470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
16480 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
16490 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
164a0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
164b0 65 78 20 6f 62 6a 65 63 74 20 74 6f 0a 20 20 20  ex object to.   
164c0 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68   ** represent th
164d0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
164e0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72  .    Index *pFir
164f0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
16500 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20     /* Any other 
16510 69 6e 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62  index on the tab
16520 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  le */.    memset
16530 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sPk, 0, sizeof
16540 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50  (Index));.    sP
16550 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
16560 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20     sPk.aiColumn 
16570 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20  = &aiColumnPk;. 
16580 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20     sPk.aiRowEst 
16590 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20  = aiRowEstPk;.  
165a0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
165b0 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  = 1;.    sPk.onE
165c0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
165d0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
165e0 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
165f0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
16600 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
16610 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
16620 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
16630 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
16640 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
16650 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77      /* The aiRow
16660 45 73 74 50 6b 5b 30 5d 20 69 73 20 61 6e 20 65  EstPk[0] is an e
16670 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 74  stimate of the t
16680 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  otal number of r
16690 6f 77 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ows in the.    *
166a0 2a 20 74 61 62 6c 65 2e 20 20 47 65 74 20 74 68  * table.  Get th
166b0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  is information f
166c0 72 6f 6d 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  rom the ANALYZE 
166d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66 20 69  information if i
166e0 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 76 61 69  t is.    ** avai
166f0 6c 61 62 6c 65 2e 20 20 49 66 20 6e 6f 74 20 61  lable.  If not a
16700 76 61 69 6c 61 62 6c 65 2c 20 61 73 73 75 6d 65  vailable, assume
16710 20 74 68 65 20 74 61 62 6c 65 20 31 20 6d 69 6c   the table 1 mil
16720 6c 69 6f 6e 20 72 6f 77 73 20 69 6e 20 73 69 7a  lion rows in siz
16730 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
16740 28 20 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ( pFirst ){.    
16750 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
16760 2d 3e 61 69 52 6f 77 45 73 74 21 3d 30 20 29 3b  ->aiRowEst!=0 );
16770 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 74 6f   /* Allocated to
16780 67 65 74 68 65 72 20 77 69 74 68 20 70 46 69 72  gether with pFir
16790 73 74 20 2a 2f 0a 20 20 20 20 20 20 61 69 52 6f  st */.      aiRo
167a0 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 46 69 72  wEstPk[0] = pFir
167b0 73 74 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  st->aiRowEst[0];
167c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
167d0 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
167e0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 7d  = 1000000;.    }
167f0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
16800 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  Pk;.    wsFlagMa
16810 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20  sk = ~(.        
16820 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
16830 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
16840 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
16850 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  L|WHERE_COLUMN_R
16860 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  ANGE.    );.    
16870 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
16880 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49  EQ|WO_IN;.    pI
16890 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  dx = 0;.  }..  /
168a0 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
168b0 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20  indices looking 
168c0 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65  for the best one
168d0 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66   to use.  */.  f
168e0 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64  or(; pProbe; pId
168f0 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  x=pProbe=pProbe-
16900 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e  >pNext){.    con
16910 73 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  st unsigned int 
16920 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74  * const aiRowEst
16930 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
16940 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  Est;.    double 
16950 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
16960 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
16970 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a  using pProbe */.
16980 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b      double nRow;
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
169b0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72  ber of rows in r
169c0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
169d0 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169f0 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
16a00 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
16a10 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
16a20 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73   = 0;.    Bitmas
16a30 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20  k used = 0;..   
16a40 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
16a50 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  g variables are 
16a60 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
16a70 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65  on the propertie
16a80 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73 63 61 6e  s of.    ** scan
16a90 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
16aa0 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20  . They are then 
16ab0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
16ac0 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20  e the expected. 
16ad0 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e     ** cost and n
16ae0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65  umber of rows re
16af0 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  turned..    **. 
16b00 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20 20     **  nEq: .   
16b10 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66   **    Number of
16b20 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
16b30 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c  that can be impl
16b40 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68  emented using th
16b50 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  e index..    **.
16b60 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20      **  nInMul: 
16b70 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20   .    **    The 
16b80 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e  "in-multiplier".
16b90 20 54 68 69 73 20 69 73 20 61 6e 20 65 73 74 69   This is an esti
16ba0 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79  mate of how many
16bb0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73   seek operations
16bc0 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69   .    **    SQLi
16bd0 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20  te must perform 
16be0 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  on the index in 
16bf0 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78  question. For ex
16c00 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
16c10 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63     **    WHERE c
16c20 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a  lause is:.    **
16c30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45  .    **      WHE
16c40 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33  RE a IN (1, 2, 3
16c50 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35  ) AND b IN (4, 5
16c60 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  , 6).    **.    
16c70 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73  **    SQLite mus
16c80 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b  t perform 9 look
16c90 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  ups on an index 
16ca0 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49  on (a, b), so nI
16cb0 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20  nMul is .    ** 
16cc0 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76     set to 9. Giv
16cd0 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68 65  en the same sche
16ce0 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66  ma and either of
16cf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57   the following W
16d00 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20  HERE .    **    
16d10 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a  clauses:.    **.
16d20 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52      **      WHER
16d30 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20  E a =  1.    ** 
16d40 20 20 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20       WHERE a >= 
16d50 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  2.    **.    ** 
16d60 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74     nInMul is set
16d70 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20   to 1..    **.  
16d80 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65    **    If there
16d90 20 65 78 69 73 74 73 20 61 20 57 48 45 52 45 20   exists a WHERE 
16da0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
16db0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
16dc0 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20  ..)", then .    
16dd0 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d 73 65  **    the sub-se
16de0 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65 64 20  lect is assumed 
16df0 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77  to return 25 row
16e00 73 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  s for the purpos
16e10 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20  es of .    **   
16e20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e   determining nIn
16e30 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  Mul..    **.    
16e40 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20  **  bInEst:  .  
16e50 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74    **    Set to t
16e60 72 75 65 20 69 66 20 74 68 65 72 65 20 77 61 73  rue if there was
16e70 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78   at least one "x
16e80 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
16e90 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20  " term used .   
16ea0 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d   **    in determ
16eb0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
16ec0 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a  of nInMul..    *
16ed0 2a 0a 20 20 20 20 2a 2a 20 20 6e 42 6f 75 6e 64  *.    **  nBound
16ee0 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20 65  :.    **    An e
16ef0 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 61  stimate on the a
16f00 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 61 62  mount of the tab
16f10 6c 65 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  le that must be 
16f20 73 65 61 72 63 68 65 64 2e 20 20 41 0a 20 20 20  searched.  A.   
16f30 20 2a 2a 20 20 20 20 76 61 6c 75 65 20 6f 66 20   **    value of 
16f40 31 30 30 20 6d 65 61 6e 73 20 74 68 65 20 65 6e  100 means the en
16f50 74 69 72 65 20 74 61 62 6c 65 20 69 73 20 73 65  tire table is se
16f60 61 72 63 68 65 64 2e 20 20 52 61 6e 67 65 20 63  arched.  Range c
16f70 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
16f80 2a 20 20 20 20 6d 69 67 68 74 20 72 65 64 75 63  *    might reduc
16f90 65 20 74 68 69 73 20 74 6f 20 61 20 76 61 6c 75  e this to a valu
16fa0 65 20 6c 65 73 73 20 74 68 61 6e 20 31 30 30 20  e less than 100 
16fb0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
16fc0 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20   only.    **    
16fd0 61 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 74 68  a fraction of th
16fe0 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 73 65  e table needs se
16ff0 61 72 63 68 69 6e 67 2e 20 20 49 6e 20 74 68 65  arching.  In the
17000 20 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20 20   absence of.    
17010 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61  **    sqlite_sta
17020 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t2 ANALYZE data,
17030 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75 61   a single inequa
17040 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65  lity reduces the
17050 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20   search.    **  
17060 20 20 73 70 61 63 65 20 74 6f 20 31 2f 33 72 64    space to 1/3rd
17070 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
17080 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e 3f 20 63  ze.  So an x>? c
17090 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65  onstraint reduce
170a0 73 0a 20 20 20 20 2a 2a 20 20 20 20 6e 42 6f 75  s.    **    nBou
170b0 6e 64 20 74 6f 20 33 33 2e 20 20 54 77 6f 20 63  nd to 33.  Two c
170c0 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20  onstraints (x>? 
170d0 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 20  AND x<?) reduce 
170e0 6e 42 6f 75 6e 64 20 74 6f 20 31 31 2e 0a 20 20  nBound to 11..  
170f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f    **.    **  bSo
17100 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20  rt:   .    **   
17110 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
17120 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
17130 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68  DER BY clause th
17140 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
17150 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78  an .    **    ex
17160 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65  ternal sort (i.e
17170 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69  . scanning the i
17180 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75  ndex being evalu
17190 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20  ated will not . 
171a0 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74     **    correct
171b0 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73  ly order records
171c0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
171d0 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20    bLookup: .    
171e0 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54  **    Boolean. T
171f0 72 75 65 20 69 66 20 66 6f 72 20 65 61 63 68 20  rue if for each 
17200 69 6e 64 65 78 20 65 6e 74 72 79 20 76 69 73 69  index entry visi
17210 74 65 64 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e 20  ted a lookup on 
17220 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 63  the .    **    c
17230 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
17240 6c 65 20 62 2d 74 72 65 65 20 69 73 20 72 65 71  le b-tree is req
17250 75 69 72 65 64 2e 20 54 68 69 73 20 69 73 20 61  uired. This is a
17260 6c 77 61 79 73 20 66 61 6c 73 65 20 0a 20 20 20  lways false .   
17270 20 2a 2a 20 20 20 20 66 6f 72 20 74 68 65 20 72   **    for the r
17280 6f 77 69 64 20 69 6e 64 65 78 2e 20 46 6f 72 20  owid index. For 
17290 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
172a0 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
172b0 20 61 6c 6c 20 74 68 65 20 0a 20 20 20 20 2a 2a   all the .    **
172c0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
172d0 68 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  he table used by
172e0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
172f0 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e  ement are presen
17300 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  t in .    **    
17310 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68 20  the index (such 
17320 61 6e 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65  an index is some
17330 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20  times described 
17340 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
17350 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20  dex)..    **    
17360 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76  For example, giv
17370 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  en the index on 
17380 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f  (a, b), the seco
17390 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd of the follow
173a0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  ing .    **    t
173b0 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69  wo queries requi
173c0 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65  res table b-tree
173d0 20 6c 6f 6f 6b 75 70 73 2c 20 62 75 74 20 74 68   lookups, but th
173e0 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74  e first does not
173f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17400 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
17410 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d 20  CT a, b    FROM 
17420 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
17430 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
17440 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c      SELECT a, b,
17450 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52   c FROM tbl WHER
17460 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a  E a = 1;.    */.
17470 20 20 20 20 69 6e 74 20 6e 45 71 3b 0a 20 20 20      int nEq;.   
17480 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30 3b   int bInEst = 0;
17490 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20  .    int nInMul 
174a0 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6f  = 1;.    int nBo
174b0 75 6e 64 20 3d 20 31 30 30 3b 0a 20 20 20 20 69  und = 100;.    i
174c0 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20  nt bSort = 0;.  
174d0 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20    int bLookup = 
174e0 30 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72  0;..    /* Deter
174f0 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20  mine the values 
17500 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75  of nEq and nInMu
17510 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71  l */.    for(nEq
17520 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  =0; nEq<pProbe->
17530 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b  nColumn; nEq++){
17540 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
17550 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
17560 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
17570 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
17580 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
17590 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
175a0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
175b0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
175c0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
175d0 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65  , j, notReady, e
175e0 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29  qTermMask, pIdx)
175f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
17600 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
17610 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28      wsFlags |= (
17620 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c  WHERE_COLUMN_EQ|
17630 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b  WHERE_ROWID_EQ);
17640 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
17650 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
17660 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
17670 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
17680 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
17690 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
176a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
176b0 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
176c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
176d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
176e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  ){.          nIn
176f0 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
17700 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
17710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
17720 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
17730 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
17740 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e  InMul *= pExpr->
17750 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  x.pList->nExpr +
17760 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
17770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
17780 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
17790 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
177a0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
177b0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
177c0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
177d0 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d    used |= pTerm-
177e0 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
177f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65    }..    /* Dete
17800 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
17810 6f 66 20 6e 42 6f 75 6e 64 2e 20 2a 2f 0a 20 20  of nBound. */.  
17820 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65    if( nEq<pProbe
17830 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
17840 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
17850 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
17860 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64  ;.      if( find
17870 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
17880 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
17890 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
178a0 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_GE, pIdx) ){. 
178b0 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
178c0 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72   *pTop = findTer
178d0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
178e0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
178f0 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20  WO_LE, pIdx);.  
17900 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
17910 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d  *pBtm = findTerm
17920 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
17930 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
17940 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_GE, pIdx);.   
17950 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53       whereRangeS
17960 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
17970 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74 6d  Probe, nEq, pBtm
17980 2c 20 70 54 6f 70 2c 20 26 6e 42 6f 75 6e 64 29  , pTop, &nBound)
17990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
179a0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
179b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
179c0 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
179d0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
179e0 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  op->prereqRight;
179f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17a00 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20     if( pBtm ){. 
17a10 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
17a20 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
17a30 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75  MIT;.          u
17a40 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65  sed |= pBtm->pre
17a50 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
17a60 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c    }.        wsFl
17a70 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
17a80 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
17a90 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20  _ROWID_RANGE);. 
17aa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17ab0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45   if( pProbe->onE
17ac0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
17ad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17ae0 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
17af0 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20  _COLUMN_IN );.  
17b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73      testcase( ws
17b10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
17b20 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  LUMN_NULL );.   
17b30 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
17b40 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
17b50 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
17b60 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20  NULL))==0 ){.   
17b70 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
17b80 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
17b90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17ba0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
17bb0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
17bc0 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  se and the index
17bd0 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
17be0 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61  d will.    ** na
17bf0 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77  turally scan row
17c00 73 20 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  s in the require
17c10 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65  d order, set the
17c20 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61   appropriate fla
17c30 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46  gs.    ** in wsF
17c40 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  lags. Otherwise,
17c50 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
17c60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17c70 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20  but the index.  
17c80 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72    ** will scan r
17c90 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65 72 65  ows in a differe
17ca0 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68  nt order, set th
17cb0 65 20 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65  e bSort variable
17cc0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f  .  */.    if( pO
17cd0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
17ce0 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 28  if( (wsFlags & (
17cf0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
17d00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
17d10 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  L))==0.        &
17d20 26 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78  & isSortingIndex
17d30 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61  (pParse,pWC->pMa
17d40 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75  skSet,pProbe,iCu
17d50 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26  r,pOrderBy,nEq,&
17d60 72 65 76 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  rev).      ){.  
17d70 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
17d80 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
17d90 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
17da0 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44 45  RANGE|WHERE_ORDE
17db0 52 42 59 3b 0a 20 20 20 20 20 20 20 20 77 73 46  RBY;.        wsF
17dc0 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57  lags |= (rev ? W
17dd0 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30  HERE_REVERSE : 0
17de0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17df0 20 20 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20          bSort = 
17e00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17e10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72  ..    /* If curr
17e20 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e  ently calculatin
17e30 67 20 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73  g the cost of us
17e40 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f  ing an index (no
17e50 74 20 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a  t the IPK.    **
17e60 20 69 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69   index), determi
17e70 6e 65 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72  ne if all requir
17e80 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d  ed column data m
17e90 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77  ay be obtained w
17ea0 69 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 73  ithout .    ** s
17eb0 65 65 6b 69 6e 67 20 74 6f 20 65 6e 74 72 69 65  eeking to entrie
17ec0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  s in the main ta
17ed0 62 6c 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ble (i.e. if the
17ee0 20 69 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65   index is a cove
17ef0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65  ring.    ** inde
17f00 78 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  x for this query
17f10 29 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74  ). If it is, set
17f20 20 74 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f   the WHERE_IDX_O
17f30 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20  NLY flag in.    
17f40 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65  ** wsFlags. Othe
17f50 72 77 69 73 65 2c 20 73 65 74 20 74 68 65 20 62  rwise, set the b
17f60 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20  Lookup variable 
17f70 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20  to true.  */.   
17f80 20 69 66 28 20 70 49 64 78 20 26 26 20 77 73 46   if( pIdx && wsF
17f90 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69  lags ){.      Bi
17fa0 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
17fb0 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
17fc0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
17fd0 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
17fe0 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
17ff0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
18000 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
18010 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
18020 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
18030 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b  m &= ~(((Bitmask
18040 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20  )1)<<x);.       
18050 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18060 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20   if( m==0 ){.   
18070 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
18080 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
18090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
180a0 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31       bLookup = 1
180b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
180c0 0a 20 20 20 20 2f 2a 2a 2a 2a 20 42 65 67 69 6e  .    /**** Begin
180d0 20 61 64 64 69 6e 67 20 75 70 20 74 68 65 20 63   adding up the c
180e0 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69  ost of using thi
180f0 73 20 69 6e 64 65 78 20 28 4e 65 65 64 73 20 69  s index (Needs i
18100 6d 70 72 6f 76 65 6d 65 6e 74 73 29 0a 20 20 20  mprovements).   
18110 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d   **.    ** Estim
18120 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
18130 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74  f rows of output
18140 2e 20 20 46 6f 72 20 61 6e 20 49 4e 20 6f 70 65  .  For an IN ope
18150 72 61 74 6f 72 2c 0a 20 20 20 20 2a 2a 20 64 6f  rator,.    ** do
18160 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74   not let the est
18170 69 6d 61 74 65 20 65 78 63 65 65 64 20 68 61 6c  imate exceed hal
18180 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
18190 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
181a0 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62      nRow = (doub
181b0 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71  le)(aiRowEst[nEq
181c0 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20  ] * nInMul);.   
181d0 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e   if( bInEst && n
181e0 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30  Row*2>aiRowEst[0
181f0 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ] ){.      nRow 
18200 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b  = aiRowEst[0]/2;
18210 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20  .      nInMul = 
18220 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52  (int)(nRow / aiR
18230 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20  owEst[nEq]);.   
18240 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 75 6d   }..    /* Assum
18250 65 20 63 6f 6e 73 74 61 6e 74 20 63 6f 73 74 20  e constant cost 
18260 74 6f 20 61 63 63 65 73 73 20 61 20 72 6f 77 20  to access a row 
18270 61 6e 64 20 6c 6f 67 61 72 69 74 68 6d 69 63 20  and logarithmic 
18280 63 6f 73 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64  cost to.    ** d
18290 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  o a binary searc
182a0 68 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 69  h.  Hence, the i
182b0 6e 69 74 69 61 6c 20 63 6f 73 74 20 69 73 20 74  nitial cost is t
182c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
182d0 70 75 74 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20  put.    ** rows 
182e0 70 6c 75 73 20 6c 6f 67 32 28 74 61 62 6c 65 2d  plus log2(table-
182f0 73 69 7a 65 29 20 74 69 6d 65 73 20 74 68 65 20  size) times the 
18300 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 61 72 79  number of binary
18310 20 73 65 61 72 63 68 65 73 2e 0a 20 20 20 20 2a   searches..    *
18320 2f 0a 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  /.    cost = nRo
18330 77 20 2b 20 6e 49 6e 4d 75 6c 2a 65 73 74 4c 6f  w + nInMul*estLo
18340 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b 0a  g(aiRowEst[0]);.
18350 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74  .    /* Adjust t
18360 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18370 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74 20 64  s and the cost d
18380 6f 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c 65  ownward to refle
18390 63 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74  ct rows.    ** t
183a0 68 61 74 20 61 72 65 20 65 78 63 6c 75 64 65 64  hat are excluded
183b0 20 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   by range constr
183c0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
183d0 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2a    nRow = (nRow *
183e0 20 28 64 6f 75 62 6c 65 29 6e 42 6f 75 6e 64 29   (double)nBound)
183f0 20 2f 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a   / (double)100;.
18400 20 20 20 20 63 6f 73 74 20 3d 20 28 63 6f 73 74      cost = (cost
18410 20 2a 20 28 64 6f 75 62 6c 65 29 6e 42 6f 75 6e   * (double)nBoun
18420 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31 30 30  d) / (double)100
18430 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e  ;..    /* Add in
18440 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63   the estimated c
18450 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74  ost of sorting t
18460 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2f  he result.    */
18470 0a 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29  .    if( bSort )
18480 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
18490 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74  cost*estLog(cost
184a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
184b0 20 49 66 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74   If all informat
184c0 69 6f 6e 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ion can be taken
184d0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
184e0 68 65 20 69 6e 64 65 78 2c 20 77 65 20 61 76 6f  he index, we avo
184f0 69 64 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  id.    ** doing 
18500 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20  table lookups.  
18510 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
18520 20 63 6f 73 74 20 62 79 20 68 61 6c 66 2e 20 20   cost by half.  
18530 28 4e 6f 74 20 72 65 61 6c 6c 79 20 2d 0a 20 20  (Not really -.  
18540 20 20 2a 2a 20 74 68 69 73 20 6e 65 65 64 73 20    ** this needs 
18550 74 6f 20 62 65 20 66 69 78 65 64 2e 29 0a 20 20  to be fixed.).  
18560 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64    */.    if( pId
18570 78 20 26 26 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20  x && bLookup==0 
18580 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  ){.      cost /=
18590 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
185a0 7d 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  }.    /**** Cost
185b0 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
185c0 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
185d0 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
185e0 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ..    WHERETRACE
185f0 28 28 0a 20 20 20 20 20 20 22 25 73 28 25 73 29  ((.      "%s(%s)
18600 3a 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d  : nEq=%d nInMul=
18610 25 64 20 6e 42 6f 75 6e 64 3d 25 64 20 62 53 6f  %d nBound=%d bSo
18620 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64  rt=%d bLookup=%d
18630 20 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22   wsFlags=0x%x\n"
18640 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20  .      "        
18650 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78   notReady=0x%llx
18660 20 6e 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74 3d   nRow=%.2f cost=
18670 25 2e 32 66 20 75 73 65 64 3d 30 78 25 6c 6c 78  %.2f used=0x%llx
18680 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d  \n",.      pSrc-
18690 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70  >pTab->zName, (p
186a0 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  Idx ? pIdx->zNam
186b0 65 20 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20 20  e : "ipk"), .   
186c0 20 20 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20     nEq, nInMul, 
186d0 6e 42 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62  nBound, bSort, b
186e0 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c  Lookup, wsFlags,
186f0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 52 6f 77 2c   notReady, nRow,
18700 20 63 6f 73 74 2c 20 75 73 65 64 0a 20 20 20 20   cost, used.    
18710 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ));..    /* If t
18720 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
18730 20 62 65 73 74 20 77 65 20 68 61 76 65 20 73 65   best we have se
18740 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20  en so far, then 
18750 72 65 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20  record this.    
18760 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73  ** index and its
18770 20 63 6f 73 74 20 69 6e 20 74 68 65 20 70 43 6f   cost in the pCo
18780 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  st structure..  
18790 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
187a0 49 64 78 20 7c 7c 20 77 73 46 6c 61 67 73 29 20  Idx || wsFlags) 
187b0 26 26 20 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72  && cost<pCost->r
187c0 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Cost ){.      pC
187d0 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73  ost->rCost = cos
187e0 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  t;.      pCost->
187f0 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nRow = nRow;.   
18800 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d     pCost->used =
18810 20 75 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f   used;.      pCo
18820 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
18830 20 3d 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c   = (wsFlags&wsFl
18840 61 67 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70  agMask);.      p
18850 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  Cost->plan.nEq =
18860 20 6e 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73   nEq;.      pCos
18870 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d  t->plan.u.pIdx =
18880 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20   pIdx;.    }..  
18890 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
188a0 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
188b0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
188c0 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
188d0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
188e0 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
188f0 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
18900 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
18910 52 65 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20  Reset masks for 
18920 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69  the next index i
18930 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
18940 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e    wsFlagMask = ~
18950 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
18960 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
18970 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61  E);.    eqTermMa
18980 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61  sk = idxEqTermMa
18990 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  sk;.  }..  /* If
189a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
189b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
189c0 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65   the SQLITE_Reve
189d0 72 73 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20  rseOrder flag.  
189e0 2a 2a 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ** is set, then 
189f0 72 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  reverse the orde
18a00 72 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  r that the index
18a10 20 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64   will be scanned
18a20 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69  .  ** in. This i
18a30 73 20 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69  s used for appli
18a40 63 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20  cation testing, 
18a50 74 6f 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73  to help find cas
18a60 65 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70  es.  ** where ap
18a70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69  plication behavi
18a80 6f 75 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  our depends on t
18a90 68 65 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f  he (undefined) o
18aa0 72 64 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53  rder that.  ** S
18ab0 51 4c 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f  QLite outputs ro
18ac0 77 73 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73  ws in in the abs
18ad0 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52  ence of an ORDER
18ae0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a   BY clause.  */.
18af0 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20    if( !pOrderBy 
18b00 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  && pParse->db->f
18b10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
18b20 76 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20  verseOrder ){.  
18b30 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
18b40 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
18b50 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61  EVERSE;.  }..  a
18b60 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
18b70 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  || (pCost->plan.
18b80 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  wsFlags&WHERE_OR
18b90 44 45 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61  DERBY)==0 );.  a
18ba0 73 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c  ssert( pCost->pl
18bb0 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20  an.u.pIdx==0 || 
18bc0 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46  (pCost->plan.wsF
18bd0 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44  lags&WHERE_ROWID
18be0 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  _EQ)==0 );.  ass
18bf0 65 72 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65  ert( pSrc->pInde
18c00 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  x==0 .       || 
18c10 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
18c20 64 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  dx==0 .       ||
18c30 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
18c40 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65  Idx==pSrc->pInde
18c50 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45  x .  );..  WHERE
18c60 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64  TRACE(("best ind
18c70 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20  ex is: %s\n", . 
18c80 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e     (pCost->plan.
18c90 75 2e 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e  u.pIdx ? pCost->
18ca0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
18cb0 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29  me : "ipk").  ))
18cc0 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61  ;.  .  bestOrCla
18cd0 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  useIndex(pParse,
18ce0 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
18cf0 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20  eady, pOrderBy, 
18d00 70 43 6f 73 74 29 3b 0a 20 20 62 65 73 74 54 72  pCost);.  bestTr
18d10 61 6e 73 69 65 6e 74 49 6e 64 65 78 28 70 50 61  ansientIndex(pPa
18d20 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
18d30 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f 73 74 29  notReady, pCost)
18d40 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  ;.  pCost->plan.
18d50 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54 65 72  wsFlags |= eqTer
18d60 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mMask;.}../*.** 
18d70 46 69 6e 64 20 74 68 65 20 71 75 65 72 79 20 70  Find the query p
18d80 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e  lan for accessin
18d90 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e 70 54  g table pSrc->pT
18da0 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ab. Write the.**
18db0 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
18dc0 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e   and its cost in
18dd0 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74  to the WhereCost
18de0 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64   object supplied
18df0 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61 73 74   .** as the last
18e00 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 69 73   parameter. This
18e10 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61   function may ca
18e20 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74  lculate the cost
18e30 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c   of.** both real
18e40 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62   and virtual tab
18e50 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61  le scans..*/.sta
18e60 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
18e70 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
18e80 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
18e90 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
18ea0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
18eb0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
18ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18ed0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18ee0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18ef0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
18f00 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18f10 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
18f20 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
18f30 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
18f40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
18f50 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
18f60 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
18f70 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
18f80 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
18f90 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
18fa0 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  use */.  WhereCo
18fb0 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
18fc0 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
18fd0 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
18fe0 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
18ff0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19000 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
19010 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
19020 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
19030 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d  _index_info *p =
19040 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74   0;.    bestVirt
19050 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
19060 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
19070 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20  eady, pOrderBy, 
19080 70 43 6f 73 74 2c 20 26 70 29 3b 0a 20 20 20 20  pCost, &p);.    
19090 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65  if( p->needToFre
190a0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
190b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
190c0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  >idxStr);.    }.
190d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
190e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  e(pParse->db, p)
190f0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
19100 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72  .  {.    bestBtr
19110 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  eeIndex(pParse, 
19120 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
19130 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  ady, pOrderBy, p
19140 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Cost);.  }.}../*
19150 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
19160 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
19170 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
19180 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
19190 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
191a0 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
191b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
191c0 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
191d0 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
191e0 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
191f0 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
19200 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
19210 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
19220 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
19230 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
19240 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
19250 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
19260 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
19270 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
19280 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
19290 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
192a0 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
192b0 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
192c0 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
192d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
192e0 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
192f0 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
19300 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
19310 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
19320 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
19330 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
19340 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
19350 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
19360 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
19370 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
19380 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
19390 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
193a0 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
193b0 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
193c0 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
193d0 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
193e0 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
193f0 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
19400 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
19410 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
19420 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
19430 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
19440 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
19450 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
19460 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
19470 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
19480 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
19490 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
194a0 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
194b0 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
194c0 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
194d0 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
194e0 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
194f0 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
19500 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
19510 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
19520 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
19530 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
19540 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
19550 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
19560 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
19570 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
19580 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
19590 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
195a0 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
195b0 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
195c0 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
195d0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
195e0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
195f0 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
19600 20 26 26 20 41 4c 57 41 59 53 28 28 70 54 65 72   && ALWAYS((pTer
19610 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19620 4d 5f 43 4f 44 45 44 29 3d 3d 30 29 0a 20 20 20  M_CODED)==0).   
19630 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
19640 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
19650 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19660 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
19670 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
19680 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
19690 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
196a0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
196b0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
196c0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
196d0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
196e0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
196f0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
19700 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
19710 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
19720 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
19730 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
19740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19750 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19760 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
19770 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
19780 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
19790 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
197a0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
197b0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
197c0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
197d0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
197e0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
197f0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
19800 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
19810 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
19820 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
19830 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
19840 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
19850 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
19860 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
19870 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
19880 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
19890 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
198a0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
198b0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
198c0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
198d0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
198e0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
198f0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19900 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
19910 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
19920 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
19930 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
19940 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
19950 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19960 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
19970 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
19980 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
19990 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
199a0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
199b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
199c0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
199d0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
199e0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
199f0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
19a00 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
19a10 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
19a20 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
19a30 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
19a40 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
19a50 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
19a60 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
19a70 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
19a80 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
19a90 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
19aa0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
19ab0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
19ac0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
19ad0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
19ae0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
19af0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
19b00 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
19b10 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
19b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b30 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
19b40 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
19b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19b60 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
19b70 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
19b80 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19b90 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
19ba0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
19bb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
19bc0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
19bd0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
19be0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
19bf0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
19c00 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
19c10 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
19c20 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
19c30 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
19c40 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
19c50 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
19c60 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
19c70 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
19c80 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
19c90 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
19ca0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
19cb0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
19cc0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
19cd0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
19ce0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
19cf0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
19d00 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
19d10 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
19d20 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
19d30 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
19d40 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
19d50 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
19d60 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
19d70 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
19d80 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
19d90 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
19da0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
19db0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
19dc0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
19dd0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
19de0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
19df0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
19e00 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
19e10 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
19e20 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
19e30 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
19e40 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
19e50 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
19e60 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
19e70 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
19e80 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
19e90 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
19ea0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
19eb0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
19ec0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
19ed0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
19ee0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
19ef0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
19f00 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
19f10 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
19f20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
19f30 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
19f40 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
19f50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
19f60 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
19f70 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
19f80 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
19f90 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
19fa0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
19fb0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
19fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19fd0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
19fe0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
19ff0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1a000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a010 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
1a020 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
1a030 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
1a040 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1a050 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
1a060 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
1a070 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
1a080 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a090 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
1a0a0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
1a0b0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
1a0c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a0d0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1a0e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a0f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1a100 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1a110 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
1a120 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1a130 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
1a140 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
1a150 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1a160 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
1a170 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
1a180 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
1a190 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
1a1a0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
1a1b0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
1a1c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
1a1d0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1a1e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
1a210 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
1a220 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1a230 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
1a240 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1a250 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
1a260 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
1a270 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
1a280 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
1a290 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
1a2a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
1a2b0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
1a2c0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
1a2d0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
1a2e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a2f0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
1a300 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
1a310 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
1a320 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
1a330 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a340 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
1a350 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
1a360 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1a370 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1a380 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
1a390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1a3b0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
1a3c0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
1a3d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
1a3e0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
1a3f0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
1a400 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1a410 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
1a420 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
1a430 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
1a440 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ** index..**.** 
1a450 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
1a460 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
1a470 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
1a480 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
1a490 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
1a4a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
1a4b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
1a4c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
1a4d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
1a4e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
1a4f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
1a500 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1a510 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
1a520 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
1a530 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
1a540 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
1a550 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
1a560 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
1a570 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
1a580 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1a590 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
1a5a0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
1a5b0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
1a5c0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
1a5d0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
1a5e0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
1a5f0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
1a600 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
1a610 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
1a620 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1a630 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
1a640 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1a650 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
1a660 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
1a670 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1a680 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
1a690 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
1a6a0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
1a6b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1a6c0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
1a6d0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
1a6e0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
1a6f0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
1a700 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
1a710 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
1a720 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
1a730 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
1a740 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
1a750 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
1a760 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
1a770 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
1a780 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
1a790 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
1a7a0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
1a7b0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
1a7c0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
1a7d0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
1a7e0 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
1a7f0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
1a800 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
1a810 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
1a820 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
1a830 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
1a840 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
1a850 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
1a860 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
1a870 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
1a880 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
1a890 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
1a8a0 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
1a8b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
1a8c0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1a8d0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
1a8e0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
1a8f0 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
1a900 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
1a910 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
1a920 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
1a930 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
1a940 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
1a950 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
1a960 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
1a970 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
1a980 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
1a990 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
1a9a0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1a9b0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
1a9c0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
1a9d0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
1a9e0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1a9f0 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
1aa00 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
1aa10 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
1aa20 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
1aa30 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
1aa40 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
1aa50 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1aa60 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
1aa70 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
1aa80 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
1aa90 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
1aaa0 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
1aab0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1aac0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
1aad0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
1aae0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
1aaf0 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
1ab00 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
1ab10 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
1ab20 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
1ab30 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
1ab40 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
1ab50 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
1ab60 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
1ab70 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
1ab80 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
1ab90 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
1aba0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1abb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1abc0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
1abd0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
1abe0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1abf0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1ac00 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1ac10 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
1ac20 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
1ac30 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
1ac40 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
1ac50 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1ac60 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1ac70 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
1ac80 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
1ac90 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
1aca0 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
1acb0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
1acc0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
1acd0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
1ace0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1acf0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1ad00 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1ad10 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
1ad20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
1ad30 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
1ad40 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
1ad50 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
1ad60 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20  el->plan.nEq;   
1ad70 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1ad80 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
1ad90 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
1ada0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1adb0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
1adc0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
1add0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1ade0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
1ae10 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
1ae20 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
1ae30 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
1ae40 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65  TabCur;   /* The
1ae50 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
1ae60 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  able */.  WhereT
1ae70 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1ae80 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1ae90 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1aea0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  erm */.  int j; 
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1aed0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
1aee0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1aef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1af00 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
1af10 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af30 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
1af40 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1af50 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
1af60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af70 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1af80 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  string to return
1af90 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
1afa0 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
1afb0 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
1afc0 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
1afd0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65  index. */.  asse
1afe0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
1aff0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1b000 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49  _INDEXED );.  pI
1b010 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
1b020 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20  n.u.pIdx;..  /* 
1b030 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1b040 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
1b050 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
1b060 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
1b070 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
1b080 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1b090 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
1b0a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
1b0b0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
1b0c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1b0d0 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
1b0e0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
1b0f0 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
1b100 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
1b110 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
1b120 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
1b130 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1b140 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1b150 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
1b160 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1b170 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
1b180 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
1b190 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20  Column>=nEq );. 
1b1a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
1b1b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
1b1c0 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70  1;.    int k = p
1b1d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
1b1e0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
1b1f0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1b200 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  , k, notReady, p
1b210 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1b220 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ags, pIdx);.    
1b230 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d  if( NEVER(pTerm=
1b240 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
1b250 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
1b260 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b270 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  CODED)==0 );.   
1b280 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
1b290 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1b2a0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65  Term, pLevel, re
1b2b0 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
1b2c0 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
1b2d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
1b2e0 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
1b2f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1b300 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1b310 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
1b320 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
1b330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b350 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1b360 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
1b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b380 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1b390 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1b3a0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
1b3b0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1b3c0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1b3d0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
1b3e0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1b3f0 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
1b400 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
1b410 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1b420 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
1b430 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
1b440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
1b450 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
1b460 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
1b470 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1b480 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
1b490 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1b4a0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1b4b0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
1b4c0 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
1b4d0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
1b4e0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1b4f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1b500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b510 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1b520 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1b530 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
1b540 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
1b550 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1b560 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1b570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
1b590 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
1b5a0 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
1b5b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b5c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
1b5d0 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
1b5e0 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
1b5f0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
1b600 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
1b610 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
1b620 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
1b630 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
1b640 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
1b650 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
1b660 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
1b670 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1b680 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1b690 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
1b6a0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
1b6b0 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
1b6c0 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
1b6d0 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77  coded */.  u16 w
1b6e0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
1b6f0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
1b700 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
1b710 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
1b720 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  .h */.  Bitmask 
1b730 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1b740 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1b750 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1b760 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1b770 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1b780 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b790 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b7b0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b7c0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1b7d0 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1b7e0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1b7f0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1b800 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1b810 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1b820 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1b830 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1b840 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1b850 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1b860 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1b870 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1b880 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1b890 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1b8a0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1b8b0 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1b8c0 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1b8d0 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  oded */.  WhereC
1b8e0 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
1b8f0 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
1b900 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48  of the entire WH
1b910 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1b920 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1b930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b940 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  /* A WHERE claus
1b950 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73  e term */.  Pars
1b960 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
1b970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b980 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b990 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
1b9c0 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
1b9d0 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
1b9e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1b9f0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
1ba00 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1ba10 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
1ba20 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
1ba30 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1ba40 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1ba50 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
1ba60 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
1ba70 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1baa0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1bab0 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
1bac0 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
1bad0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
1bae0 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
1baf0 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
1bb00 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
1bb10 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
1bb20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
1bb30 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
1bb40 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
1bb50 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
1bb60 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1bb70 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
1bb80 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
1bb90 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70  pWInfo->pWC;.  p
1bba0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
1bbb0 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54  >a[iLevel];.  pT
1bbc0 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
1bbd0 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1bbe0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1bbf0 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
1bc00 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76  >iCursor;.  bRev
1bc10 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
1bc20 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1bc30 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20  _REVERSE)!=0;.  
1bc40 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
1bc50 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1bc60 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1bc70 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1bc80 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
1bc90 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
1bca0 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a  TABLE)==0;..  /*
1bcb0 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
1bcc0 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
1bcd0 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
1bce0 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
1bcf0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1bd00 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
1bd10 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
1bd20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
1bd30 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
1bd40 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
1bd50 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
1bd60 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
1bd70 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
1bd80 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
1bd90 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
1bda0 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
1bdb0 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
1bdc0 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
1bdd0 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
1bde0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
1bdf0 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
1be00 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
1be10 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
1be20 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
1be30 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
1be40 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
1be50 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
1be60 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
1be70 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
1be80 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
1be90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1bea0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1beb0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
1bec0 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
1bed0 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
1bee0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1bef0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
1bf00 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
1bf10 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
1bf20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
1bf30 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
1bf40 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
1bf50 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
1bf60 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
1bf70 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
1bf80 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
1bf90 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
1bfa0 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
1bfb0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
1bfc0 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
1bfd0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
1bfe0 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
1bff0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1c000 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c010 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1c020 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c030 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
1c040 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
1c050 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1c060 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
1c070 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
1c080 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  "));.  }..#ifnde
1c090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1c0a0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
1c0b0 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e    (pLevel->plan.
1c0c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c0d0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
1c0e0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1c0f0 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  0:  The table is
1c100 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
1c110 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
1c120 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
1c130 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
1c140 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
1c150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1c160 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
1c170 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
1c180 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
1c190 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
1c1a0 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
1c1b0 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
1c1c0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1c1d0 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78  raint = pVtabIdx
1c1e0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
1c1f0 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
1c200 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
1c210 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
1c220 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
1c260 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
1c270 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
1c280 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1c290 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74  nstraint *aConst
1c2a0 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20  raint =.        
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2d0 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
1c2e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
1c2f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c300 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1c310 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c  ;.    iReg = sql
1c320 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1c330 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
1c340 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72  aint+2);.    for
1c350 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72  (j=1; j<=nConstr
1c360 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
1c370 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f    for(k=0; k<nCo
1c380 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a  nstraint; k++){.
1c390 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
1c3a0 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
1c3b0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
1c3c0 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
1c3d0 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d  straint[k].iTerm
1c3e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
1c3f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c400 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61  e(pParse, pWC->a
1c410 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70  [iTerm].pExpr->p
1c420 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29  Right, iReg+j+1)
1c430 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c440 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c450 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1c460 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
1c470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c490 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c4a0 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e  , pVtabIdx->idxN
1c4b0 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  um, iReg);.    s
1c4c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c4d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1c4e0 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20  j-1, iReg+1);.  
1c4f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c500 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
1c510 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  r, iCur, addrBrk
1c520 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64 78  , iReg, pVtabIdx
1c530 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  ->idxStr,.      
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f  pVtabIdx->needTo
1c560 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f  FreeIdxStr ? P4_
1c570 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41  MPRINTF : P4_STA
1c580 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49  TIC);.    pVtabI
1c590 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  dx->needToFreeId
1c5a0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f  xStr = 0;.    fo
1c5b0 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72  r(j=0; j<nConstr
1c5c0 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
1c5d0 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
1c5e0 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
1c5f0 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e  int iTerm = aCon
1c600 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d  straint[j].iTerm
1c610 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
1c620 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1c630 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72  el, &pWC->a[iTer
1c640 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  m]);.      }.   
1c650 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f   }.    pLevel->o
1c660 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
1c670 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1c680 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Cur;.    pLevel-
1c690 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
1c6a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1c6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1c6c0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1c6d0 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
1c6e0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73  traint+2);.    s
1c6f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c700 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1c710 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1c720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1c730 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1c740 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1c750 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1c760 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
1c770 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20   /* Case 1:  We 
1c780 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66  can directly ref
1c790 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20  erence a single 
1c7a0 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  row using an.   
1c7b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
1c7c0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1c7d0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1c7e0 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
1c7f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
1c800 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
1c810 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
1c820 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
1c830 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ".    **        
1c840 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20    construct..   
1c850 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65   */.    iRelease
1c860 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1c870 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1c880 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
1c890 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1c8a0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
1c8b0 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
1c8c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1c8d0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
1c8e0 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1c8f0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1c900 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
1c910 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
1c920 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1c930 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 52  ble==0 );.    iR
1c940 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
1c950 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
1c960 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
1c970 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1c980 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1c990 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
1c9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c9b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
1c9c0 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
1c9d0 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73   addrNxt);.    s
1c9e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1c9f0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1ca00 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1ca10 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1ca20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ca30 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1ca40 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1ca50 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
1ca60 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1ca70 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1ca80 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
1ca90 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
1caa0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1cab0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
1cac0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
1cad0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1cae0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1caf0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1cb00 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1cb10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1cb20 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1cb30 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1cb40 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1cb50 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1cb60 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1cb70 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1cb80 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1cb90 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69  .    pStart = fi
1cba0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1cbb0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
1cbc0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
1cbd0 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64  .    pEnd = find
1cbe0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1cbf0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
1cc00 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
1cc10 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1cc20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1cc30 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1cc40 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1cc50 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1cc60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1cc70 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1cc80 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1cc90 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1cca0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1ccb0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1ccc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1ccd0 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1cce0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1ccf0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1cd00 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1cd10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1cd20 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1cd30 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1cd40 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1cd50 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1cd60 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1cd70 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1cd80 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1cd90 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1cda0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1cdb0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1cdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1cdd0 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1cde0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1cdf0 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1ce00 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
1ce10 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1ce20 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
1ce30 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1ce40 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
1ce50 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1ce60 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1ce70 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1ce80 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1ce90 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1cea0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1ceb0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1cec0 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1ced0 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1cee0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1cef0 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1cf00 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1cf10 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1cf20 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
1cf30 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1cf40 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1cf50 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1cf60 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
1cf70 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31  iCur );.      r1
1cf80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cf90 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1cfa0 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
1cfb0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1cfc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
1cfd0 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
1cfe0 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
1cff0 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
1d000 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d010 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
1d020 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1d030 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1d040 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
1d050 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1d060 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1d070 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
1d080 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1d090 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
1d0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1d0b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d0c0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
1d0d0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
1d0e0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
1d0f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
1d100 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1d110 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
1d120 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
1d130 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1d140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d150 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1d160 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
1d170 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1d180 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1d190 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d1a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1d1b0 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1d1c0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1d1d0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1d1e0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1d1f0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1d200 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1d210 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1d220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1d230 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1d240 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1d250 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1d260 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1d270 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1d280 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1d290 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d2a0 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1d2b0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1d2c0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1d2d0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1d2e0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1d2f0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1d300 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20    if( pStart==0 
1d310 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20  && pEnd==0 ){.  
1d320 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1d330 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1d340 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1d350 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d360 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1d370 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1d380 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  }.    if( testOp
1d390 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1d3a0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
1d3b0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1d3c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1d3d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1d3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d3f0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
1d400 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
1d410 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d420 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1d430 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1d440 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1d450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d460 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
1d470 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
1d480 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1d490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1d4a0 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
1d4b0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
1d4c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1d4d0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
1d4e0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
1d4f0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
1d500 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1d510 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1d520 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
1d530 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   3: A scan using
1d540 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1d550 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1d560 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d570 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1d580 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1d590 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1d5a0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1d5b0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1d5c0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1d5d0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1d5e0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1d5f0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1d600 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1d610 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1d620 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1d630 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1d640 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1d650 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1d660 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1d670 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1d680 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1d690 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1d6a0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1d6b0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1d6c0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1d6d0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1d6e0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1d6f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1d700 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1d710 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1d720 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1d730 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1d740 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1d750 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1d760 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1d770 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1d780 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1d790 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1d7a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1d7b0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1d7c0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1d7d0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1d7e0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1d7f0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1d800 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1d810 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1d820 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1d830 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1d840 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1d850 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1d860 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1d870 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1d880 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1d890 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1d8a0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1d8b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1d8c0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1d8d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d8e0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1d8f0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1d900 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1d910 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1d920 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1d930 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1d940 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1d950 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1d960 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1d970 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1d980 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1d990 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1d9a0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1d9b0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1d9c0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1d9d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1d9e0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1d9f0 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1da00 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1da10 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1da20 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1da30 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1da40 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1da50 2f 20 20 0a 20 20 20 20 69 6e 74 20 61 53 74 61  /  .    int aSta
1da60 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  rtOp[] = {.     
1da70 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20   0,.      0,.   
1da80 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20     OP_Rewind,   
1da90 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21          /* 2: (!
1daa0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1dab0 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1dac0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1dad0 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
1dae0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
1daf0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1db00 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
1db10 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1db20 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20  P_SeekGt,       
1db30 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
1db40 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1db50 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
1db60 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1db70 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20  SeekLt,         
1db80 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63    /* 5: (start_c
1db90 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
1dba0 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
1dbb0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1dbc0 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  ekGe,           
1dbd0 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
1dbe0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1dbf0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1dc00 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1dc10 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Le            /*
1dc20 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   7: (start_const
1dc30 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
1dc40 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1dc50 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
1dc60 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  aEndOp[] = {.   
1dc70 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20     OP_Noop,     
1dc80 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21          /* 0: (!
1dc90 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29  end_constraints)
1dca0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1dcb0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
1dcc0 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
1dcd0 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
1dce0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
1dcf0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T             /*
1dd00 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
1dd10 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f  ints && bRev) */
1dd20 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
1dd30 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
1dd40 61 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20  an.nEq;.    int 
1dd50 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
1dd60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1dd70 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
1dd80 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
1dd90 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ).. */.    int r
1dda0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1ddb0 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
1ddc0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
1ddd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
1dde0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31  es */.    int r1
1ddf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de00 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
1de10 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57  egister */.    W
1de20 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
1de30 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
1de40 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1de50 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
1de60 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
1de70 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
1de80 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
1de90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1dea0 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
1deb0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
1dec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ded0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
1dee0 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
1def0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1df00 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df20 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
1df30 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
1df40 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
1df50 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
1df60 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
1df70 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
1df80 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
1df90 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
1dfa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1dfb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
1dfc0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
1dfd0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dff0 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1e000 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1e010 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1e020 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1e030 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
1e040 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
1e050 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
1e060 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1e070 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1e080 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1e090 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1e0a0 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
1e0b0 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
1e0c0 72 20 2a 7a 41 66 66 3b 0a 0a 20 20 20 20 70 49  r *zAff;..    pI
1e0d0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
1e0e0 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49  n.u.pIdx;.    iI
1e0f0 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
1e100 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d  iIdxCur;.    k =
1e110 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1e120 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c  nEq];     /* Col
1e130 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69  umn for inequali
1e140 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
1e150 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  /..    /* If thi
1e160 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
1e170 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
1e180 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
1e190 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
1e1a0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
1e1b0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
1e1c0 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
1e1d0 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
1e1e0 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
1e1f0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1e200 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
1e210 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
1e220 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1e230 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
1e240 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
1e250 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
1e260 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
1e270 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
1e280 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
1e290 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
1e2a0 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
1e2b0 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
1e2c0 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
1e2d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
1e2e0 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
1e2f0 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
1e300 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
1e310 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
1e320 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1e330 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1e340 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26  _MIN)!=0.     &&
1e350 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
1e360 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  sFlags&WHERE_ORD
1e370 45 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70  ERBY).     && (p
1e380 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71  Idx->nColumn>nEq
1e390 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
1e3a0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
1e3b0 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20  By->nExpr==1 ); 
1e3c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  */.      /* asse
1e3d0 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt( pOrderBy->a[
1e3e0 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
1e3f0 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
1e400 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20  n[nEq] ); */.   
1e410 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
1e420 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  1;.      nExtraR
1e430 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
1e440 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
1e450 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1e460 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
1e470 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
1e480 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
1e490 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20  range. .    */. 
1e4a0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
1e4b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1e4c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
1e4d0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
1e4e0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1e4f0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
1e500 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  dy, (WO_LT|WO_LE
1e510 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
1e520 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1e530 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
1e540 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1e550 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
1e560 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
1e570 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54  ngeStart = findT
1e580 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
1e590 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
1e5a0 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29  GT|WO_GE), pIdx)
1e5b0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1e5c0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1e5d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1e5e0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1e5f0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
1e600 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
1e610 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
1e620 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
1e630 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
1e640 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
1e650 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
1e660 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
1e670 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
1e680 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
1e690 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1e6a0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c        pParse, pL
1e6b0 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65  evel, pWC, notRe
1e6c0 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20  ady, nExtraReg, 
1e6d0 26 7a 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20  &zAff.    );.   
1e6e0 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1e6f0 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20  l->addrNxt;..   
1e700 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1e710 69 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72  ing a reverse or
1e720 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61  der scan on an a
1e730 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20  scending index, 
1e740 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  or.    ** a forw
1e750 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
1e760 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
1e770 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
1e780 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  e the .    ** st
1e790 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d  art and end term
1e7a0 73 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61  s (pRangeStart a
1e7b0 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20  nd pRangeEnd).. 
1e7c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52     */.    if( bR
1e7d0 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
1e7e0 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
1e7f0 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20  TE_SO_ASC) ){.  
1e800 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
1e810 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
1e820 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
1e830 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
1e840 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
1e850 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
1e860 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
1e870 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1e880 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1e890 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
1e8a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
1e8b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1e8c0 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
1e8d0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1e8e0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
1e8f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
1e900 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
1e910 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
1e920 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74   WO_GE );.    st
1e930 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
1e940 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
1e950 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1e960 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
1e970 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
1e980 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
1e990 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
1e9a0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1e9b0 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
1e9c0 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
1e9d0 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
1e9e0 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1e9f0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
1ea00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1ea10 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1ea20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1ea30 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1ea40 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
1ea50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1ea60 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
1ea70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1ea80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ea90 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1eaa0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1eab0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1eac0 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1ead0 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1eae0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1eaf0 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
1eb00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
1eb10 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1eb20 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41  inity(pRight, zA
1eb30 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29  ff[nConstraint])
1eb40 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1eb50 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
1eb60 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
1eb70 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
1eb80 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
1eb90 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
1eba0 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
1ebb0 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
1ebc0 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
1ebd0 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
1ebe0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
1ebf0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
1ec00 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
1ec10 20 20 20 20 20 20 20 7a 41 66 66 5b 6e 43 6f 6e         zAff[nCon
1ec20 73 74 72 61 69 6e 74 5d 20 3d 20 53 51 4c 49 54  straint] = SQLIT
1ec30 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ec40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ec50 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1ec60 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1ec70 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1ec80 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29 20 29 7b  nConstraint]) ){
1ec90 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1eca0 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53  nConstraint] = S
1ecb0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1ecc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ecd0 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  }  .      nConst
1ece0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  raint++;.    }el
1ecf0 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
1ed00 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
1ed10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ed20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
1ed30 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1ed40 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
1ed50 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
1ed60 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
1ed70 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
1ed80 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
1ed90 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
1eda0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
1edb0 73 74 72 61 69 6e 74 2c 20 7a 41 66 66 29 3b 0a  straint, zAff);.
1edc0 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
1edd0 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
1ede0 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
1edf0 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
1ee00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
1ee10 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
1ee20 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
1ee30 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
1ee40 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
1ee50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ee60 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b  op==OP_SeekGt );
1ee70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1ee80 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a  p==OP_SeekGe );.
1ee90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1eea0 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
1eeb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1eec0 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20  =OP_SeekLt );.  
1eed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1eee0 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
1eef0 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
1ef00 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1ef10 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  aint);..    /* L
1ef20 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
1ef30 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
1ef40 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
1ef50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1ef60 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
1ef70 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
1ef80 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1ef90 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1efa0 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
1efb0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
1efc0 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
1efd0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1efe0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1eff0 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
1f000 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
1f010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f020 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
1f030 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
1f040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f050 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
1f060 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
1f070 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
1f080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
1f090 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1f0a0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1f0b0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1f0c0 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74  zAff[nConstraint
1f0d0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1f0e0 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
1f0f0 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
1f100 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
1f110 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
1f120 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
1f130 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
1f140 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
1f150 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
1f160 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
1f170 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
1f180 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
1f190 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
1f1a0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6e 43           zAff[nC
1f1b0 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53 51 4c  onstraint] = SQL
1f1c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1f1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f1e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
1f1f0 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
1f200 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66  ange(pRight, zAf
1f210 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29 20  f[nConstraint]) 
1f220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
1f230 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d  f[nConstraint] =
1f240 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1f250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f260 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
1f270 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
1f280 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
1f290 45 71 2b 31 2c 20 7a 41 66 66 29 3b 0a 20 20 20  Eq+1, zAff);.   
1f2a0 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f2c0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1f2d0 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 0a 20 20  ->db, zAff);..  
1f2e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
1f2f0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1f300 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
1f310 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1f320 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
1f330 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
1f340 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
1f350 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1f360 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
1f370 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
1f380 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
1f390 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
1f3a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f3b0 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
1f3c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1f3d0 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
1f3e0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
1f3f0 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
1f400 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
1f410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f420 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
1f430 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1f440 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1f450 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
1f460 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f470 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
1f480 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
1f490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f4a0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
1f4b0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
1f4c0 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
1f4d0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
1f4e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
1f4f0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1f500 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
1f510 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
1f520 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
1f530 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
1f540 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
1f550 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
1f560 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1f570 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
1f580 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
1f590 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1f5a0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1f5b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1f5c0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1f5d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1f5e0 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69  P_LIMIT );.    i
1f5f0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
1f600 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1f610 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1f620 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20  _TOP_LIMIT) ){. 
1f630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f640 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1f650 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45  umn, iIdxCur, nE
1f660 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  q, r1);.      sq
1f670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f680 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
1f690 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
1f6a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
1f6b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f6c0 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f  rse, r1);..    /
1f6d0 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65  * Seek the table
1f6e0 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75   cursor, if requ
1f6f0 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61  ired */.    disa
1f700 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1f710 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1f720 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f730 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
1f740 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54  ;.    if( !omitT
1f750 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52  able ){.      iR
1f760 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1f770 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1f780 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1f790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f7a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f7b0 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
1f7c0 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  ur, iRowidReg);.
1f7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f7e0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1f7f0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1f800 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f820 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43  2(v, OP_Seek, iC
1f830 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20  ur, iRowidReg); 
1f840 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
1f850 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  k */.    }..    
1f860 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
1f870 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
1f880 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1f890 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20  loop. Disable . 
1f8a0 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
1f8b0 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
1f8c0 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
1f8d0 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
1f8e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76  .    */.    pLev
1f8f0 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1f900 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1f910 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1f920 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d  1 = iIdxCur;.  }
1f930 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1f940 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
1f950 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
1f960 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1f970 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
1f980 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
1f990 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20  Case 4:  Two or 
1f9a0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
1f9b0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
1f9c0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
1f9d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1f9e0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1f9f0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1fa00 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
1fa10 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1fa20 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
1fa30 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1fa40 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
1fa50 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
1fa60 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
1fa70 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
1fa80 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
1fa90 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1faa0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
1fab0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
1fac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
1fad0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
1fae0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
1faf0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
1fb00 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
1fb10 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
1fb20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
1fb30 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1fb40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
1fb50 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
1fb60 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
1fb70 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
1fb80 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
1fb90 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
1fba0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
1fbb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
1fbc0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
1fbd0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
1fbe0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
1fbf0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1fc00 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
1fc10 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
1fc20 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
1fc30 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
1fc40 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
1fc50 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
1fc60 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
1fc70 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
1fc80 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
1fc90 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
1fca0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
1fcb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1fcc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
1fcd0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
1fce0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
1fcf0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1fd00 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
1fd10 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
1fd20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1fd30 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
1fd40 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1fd50 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
1fd60 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
1fd70 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
1fd80 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
1fd90 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
1fda0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
1fdb0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
1fdc0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
1fdd0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
1fde0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
1fdf0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
1fe00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fe10 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
1fe30 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
1fe40 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
1fe50 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
1fe60 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
1fe70 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
1fe80 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
1fe90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1fea0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1fec0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
1fed0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
1fee0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
1fef0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
1ff00 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
1ff10 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
1ff20 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
1ff30 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
1ff40 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
1ff50 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
1ff60 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
1ff70 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
1ff80 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
1ff90 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
1ffa0 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1ffb0 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 2f 2a 20  *pFinal;     /* 
1ffc0 46 69 6e 61 6c 20 73 75 62 74 65 72 6d 20 77 69  Final subterm wi
1ffd0 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75  thin the OR-clau
1ffe0 73 65 2e 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  se. */.    SrcLi
1fff0 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
20000 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
20010 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
20020 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
20030 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  n */..    int re
20040 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
20050 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
20060 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
20070 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
20080 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
20090 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
200c0 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
200d0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
200e0 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20100 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
20110 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
20120 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
20130 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
20140 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
20150 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
20160 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
20170 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
201a0 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
201b0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
201c0 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
201d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
201e0 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
201f0 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
20200 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
20210 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
20220 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54  Level->plan.u.pT
20230 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  erm;.    assert(
20240 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
20250 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
20260 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
20270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20280 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
20290 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
202a0 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
202b0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
202c0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69 6e  fo->wc;.    pFin
202d0 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  al = &pOrWc->a[p
202e0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a  OrWc->nTerm-1];.
202f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
20300 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
20310 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
20320 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Return;..    /* 
20330 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72 63  Set up a new Src
20340 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20 63  List ni pOrTab c
20350 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
20360 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  ble being scanne
20370 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
20380 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b 30   loop in the a[0
20390 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e  ] slot and all n
203a0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 69  otReady tables i
203b0 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a  n a[1..] slots..
203c0 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63 6f      ** This beco
203d0 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  mes the SrcList 
203e0 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
203f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
20400 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20  WhereBegin()..  
20410 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 49    */.    if( pWI
20420 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b  nfo->nLevel>1 ){
20430 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52  .      int nNotR
20440 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
20450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
20460 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79 20  ber of notReady 
20470 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
20480 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20490 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20 20  tem *origSrc;   
204a0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69    /* Original li
204b0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
204c0 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79 20        nNotReady 
204d0 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
204e0 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20   - iLevel - 1;. 
204f0 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73 71       pOrTab = sq
20500 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52  lite3StackAllocR
20510 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  aw(pParse->db,. 
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
20540 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74  f(*pOrTab)+ nNot
20550 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72  Ready*sizeof(pOr
20560 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  Tab->a[0]));.   
20570 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d 30     if( pOrTab==0
20580 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61   ) return notRea
20590 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  dy;.      pOrTab
205a0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36 29  ->nAlloc = (i16)
205b0 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29 3b  (nNotReady + 1);
205c0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
205d0 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e 41  Src = pOrTab->nA
205e0 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63  lloc;.      memc
205f0 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70 54  py(pOrTab->a, pT
20600 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28 2a  abItem, sizeof(*
20610 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20 20  pTabItem));.    
20620 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49 6e    origSrc = pWIn
20630 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
20640 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
20650 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b 2b  k<=nNotReady; k+
20660 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  +){.        memc
20670 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  py(&pOrTab->a[k]
20680 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76 65  , &origSrc[pLeve
20690 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a  l[k].iFrom], siz
206a0 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d  eof(pOrTab->a[k]
206b0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
206c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 72  }else{.      pOr
206d0 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Tab = pWInfo->pT
206e0 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a 20  abList;.    }.. 
206f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
20700 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67 69   the rowset regi
20710 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
20720 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c  NULL. An SQL NUL
20730 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71 75  L is .    ** equ
20740 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d  ivalent to an em
20750 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20 20  pty rowset..    
20760 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69  **.    ** Also i
20770 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65 74  nitialize regRet
20780 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  urn to contain t
20790 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
207a0 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20  e instruction . 
207b0 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
207c0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
207d0 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68 65  OP_Return at the
207e0 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
207f0 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  oop. This.    **
20800 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
20810 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c 45  a few obscure LE
20820 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77 68  FT JOIN cases wh
20830 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70  ere control jump
20840 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 68  s.    ** over th
20850 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
20860 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  p into the body 
20870 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  of it. In this c
20880 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
20890 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73 65  correct response
208a0 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d   for the end-of-
208b0 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20 4f  loop code (the O
208c0 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f 20  P_Return) is to 
208d0 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72  .    ** fall thr
208e0 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
208f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75   instruction, ju
20900 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74  st as an OP_Next
20910 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a 20   does if.    ** 
20920 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69  called on an uni
20930 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73 6f  nitialized curso
20940 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
20950 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
20960 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
20970 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
20980 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
20990 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
209a0 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
209b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
209c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
209d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
209e0 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
209f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74 49  .    }.    iRetI
20a00 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nit = sqlite3Vdb
20a10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
20a20 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 74  teger, 0, regRet
20a30 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  urn);..    for(i
20a40 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
20a50 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
20a60 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
20a70 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
20a80 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
20a90 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
20aa0 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f  rsor==iCur || pO
20ab0 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
20ac0 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==WO_AND ){.    
20ad0 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70      WhereInfo *p
20ae0 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  SubWInfo;       
20af0 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73     /* Info for s
20b00 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63  ingle OR-term sc
20b10 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a  an */.        /*
20b20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   Loop through ta
20b30 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
20b40 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
20b50 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
20b60 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69  pSubWInfo = sqli
20b70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
20b80 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f  arse, pOrTab, pO
20b90 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c  rTerm->pExpr, 0,
20ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bb0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f           WHERE_O
20bc0 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45  MIT_OPEN | WHERE
20bd0 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a 20 20  _OMIT_CLOSE |.  
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43        WHERE_FORC
20c00 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  E_TABLE | WHERE_
20c10 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a  ONETABLE_ONLY);.
20c20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
20c30 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
20c40 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
20c50 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
20c60 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
20c70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20c80 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
20c90 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
20ca0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
20cb0 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
20cc0 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
20cd0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
20ce0 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
20cf0 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
20d00 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
20d30 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20d50 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52  ddOp4Int(v, OP_R
20d60 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
20d70 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  wset,.          
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20da0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20db0 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20 20  +2, r, iSet);.  
20dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
20df0 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
20e00 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
20e10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62       /* The pSub
20e20 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
20e30 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  erms flag means 
20e40 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65 72  that this OR ter
20e50 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  m.          ** c
20e60 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20  ontained one or 
20e70 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72  more AND term fr
20e80 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61  om a notReady ta
20e90 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  ble.  The.      
20ea0 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f      ** terms fro
20eb0 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74  m the notReady t
20ec0 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  able could not b
20ed0 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c  e tested and wil
20ee0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  l.          ** n
20ef0 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65 64  eed to be tested
20f00 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
20f10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
20f20 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  f( pSubWInfo->un
20f30 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e  testedTerms ) un
20f40 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b  testedTerms = 1;
20f50 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ..          /* F
20f60 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74  inish the loop t
20f70 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74  hrough table ent
20f80 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20  ries that match 
20f90 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f  term pOrTerm. */
20fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20fb0 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62 57  e3WhereEnd(pSubW
20fc0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  Info);.        }
20fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
20ff0 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49 6e  angeP1(v, iRetIn
21000 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
21010 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
21020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
21040 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
21050 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
21060 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21070 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
21080 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  ;..    if( pWInf
21090 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71  o->nLevel>1 ) sq
210a0 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28 70  lite3StackFree(p
210b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61  Parse->db, pOrTa
210c0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74  b);.    if( !unt
210d0 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73  estedTerms ) dis
210e0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
210f0 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   pTerm);.  }else
21100 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21110 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
21120 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20  ZATION */..  {. 
21130 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54     /* Case 5:  T
21140 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
21150 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
21160 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
21170 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21180 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
21190 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  re table..    */
211a0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
211b0 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b  t u8 aStep[] = {
211c0 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65   OP_Next, OP_Pre
211d0 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20  v };.    static 
211e0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b  const u8 aStart[
211f0 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c  ] = { OP_Rewind,
21200 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20   OP_Last };.    
21210 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
21220 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20  || bRev==1 );.  
21230 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
21240 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  ble==0 );.    pL
21250 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70  evel->op = aStep
21260 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76  [bRev];.    pLev
21270 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
21280 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
21290 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
212a0 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b  ddOp2(v, aStart[
212b0 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64  bRev], iCur, add
212c0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
212d0 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53  l->p5 = SQLITE_S
212e0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
212f0 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e  AN_STEP;.  }.  n
21300 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
21310 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
21320 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20  t, iCur);..  /* 
21330 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
21340 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
21350 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
21360 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
21370 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
21380 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
21390 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
213a0 2a 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f  */.  k = 0;.  fo
213b0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
213c0 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
213d0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
213e0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
213f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
21400 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
21410 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
21420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
21430 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
21440 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
21450 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
21460 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
21470 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
21480 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
21490 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
214a0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
214b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
214c0 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75  tcase( pWInfo->u
214d0 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a  ntestedTerms==0.
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
214f0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
21500 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
21510 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20  ETABLE_ONLY)!=0 
21520 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  );.      pWInfo-
21530 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d  >untestedTerms =
21540 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
21550 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  ue;.    }.    pE
21560 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
21570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
21580 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
21590 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
215a0 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
215b0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
215c0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
215d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
215e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
215f0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
21600 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
21610 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
21620 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70 54     k = 1;.    pT
21630 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
21640 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
21650 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
21660 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
21670 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
21680 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
21690 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
216a0 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
216b0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
216c0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
216d0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
216e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
216f0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
21700 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
21710 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
21720 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
21730 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
21740 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21750 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
21760 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
21770 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21780 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
21790 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
217a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
217b0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
217c0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
217d0 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
217e0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
217f0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
21800 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21810 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
21820 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
21830 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
21840 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
21850 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
21860 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
21870 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
21880 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
21890 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
218a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
218b0 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
218c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
218d0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
218e0 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b  untestedTerms );
218f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
21900 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
21910 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
21920 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73  pExpr );.      s
21930 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
21940 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
21950 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74  >pExpr, addrCont
21960 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
21970 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
21980 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
21990 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
219a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
219b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
219c0 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
219d0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52  ;..  return notR
219e0 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  eady;.}..#if def
219f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
21a00 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  )./*.** The foll
21a10 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68  owing variable h
21a20 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63  olds a text desc
21a30 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79  ription of query
21a40 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a   plan generated.
21a50 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72  ** by the most r
21a60 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
21a70 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21a80 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  ).  Each call to
21a90 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f   WhereBegin.** o
21aa0 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
21ab0 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e  evious.  This in
21ac0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
21ad0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
21ae0 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e  d.** analysis on
21af0 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ly..*/.char sqli
21b00 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42  te3_query_plan[B
21b10 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65  MS*2*40];  /* Te
21b20 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  xt of the join *
21b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50  /.static int nQP
21b40 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lan = 0;        
21b50 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
21b60 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72  ee slow in _quer
21b70 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e  y_plan[] */..#en
21b80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
21b90 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72  ST */.../*.** Fr
21ba0 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
21bb0 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
21bc0 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
21bd0 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
21be0 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
21bf0 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49  Info){.  if( pWI
21c00 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nfo ){.    int i
21c10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
21c20 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
21c30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
21c40 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
21c50 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d  *pInfo = pWInfo-
21c60 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[i].pIdxInfo;.
21c70 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20        if( pInfo 
21c80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73  ){.        /* as
21c90 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65  sert( pInfo->nee
21ca0 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
21cb0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
21cc0 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20  iled ); */.     
21cd0 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
21ce0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
21cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21d00 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
21d10 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
21d20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
21d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e  e3DbFree(db, pIn
21d40 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
21d50 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61     if( pWInfo->a
21d60 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [i].plan.wsFlags
21d70 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
21d80 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 73  DEX ){.        s
21d90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21da0 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
21db0 61 6e 2e 75 2e 70 49 64 78 29 3b 0a 20 20 20 20  an.u.pIdx);.    
21dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
21dd0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
21de0 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
21df0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21e00 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
21e10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
21e20 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
21e30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
21e40 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
21e50 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
21e60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
21e70 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
21e80 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
21e90 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
21ea0 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
21eb0 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
21ec0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
21ed0 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
21ee0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
21ef0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
21f00 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
21f10 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
21f20 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
21f30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
21f40 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
21f50 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
21f60 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
21f70 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
21f80 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
21f90 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
21fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
21fb0 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
21fc0 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
21fd0 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
21fe0 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
21ff0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22000 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
22010 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
22020 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
22030 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
22040 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
22050 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
22060 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22070 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
22080 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
22090 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
220a0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
220b0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
220c0 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
220d0 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
220e0 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
220f0 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
22100 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22110 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
22120 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
22130 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
22140 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
22150 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
22160 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
22170 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
22180 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
22190 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
221a0 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
221b0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
221c0 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
221f0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
22200 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
22210 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
22220 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22230 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
22260 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
22270 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
22280 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
22290 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
222a0 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
222b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
222c0 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
222d0 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
222e0 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
222f0 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
22300 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
22310 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
22320 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
22330 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22340 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
22350 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
22360 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
22370 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
22380 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
22390 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
223a0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
223b0 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
223c0 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
223d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
223e0 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
223f0 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
22400 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
22410 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
22420 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
22430 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
22440 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
22450 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
22460 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
22470 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
22480 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
22490 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
224a0 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
224b0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
224c0 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
224d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
224e0 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
224f0 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
22500 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
22510 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
22520 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
22530 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
22540 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
22550 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
22560 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
22570 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
22580 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
22590 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
225a0 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
225b0 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
225c0 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
225d0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
225e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
225f0 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
22600 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
22610 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
22620 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
22630 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
22640 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
22650 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
22660 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
22670 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
22680 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
22690 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
226a0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
226b0 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
226c0 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
226d0 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
226e0 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
226f0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
22700 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
22710 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
22720 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
22730 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
22740 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
22750 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
22760 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
22770 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
22780 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
22790 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
227a0 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
227b0 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
227c0 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
227d0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
227e0 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
227f0 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
22800 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
22810 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
22820 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
22830 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
22840 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
22850 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
22860 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
22870 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
22880 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
22890 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
228a0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
228b0 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
228c0 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
228d0 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
228e0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
228f0 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
22900 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
22910 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
22920 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
22930 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
22940 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
22950 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
22960 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
22970 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
22980 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
22990 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
229a0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
229b0 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
229c0 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
229d0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
229e0 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
229f0 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
22a00 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
22a10 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
22a20 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
22a30 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
22a40 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
22a50 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
22a60 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
22a70 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
22a80 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
22a90 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
22aa0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
22ab0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
22ac0 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
22ad0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
22ae0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
22af0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22b00 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
22b10 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
22b20 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
22b30 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
22b40 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
22b50 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
22b60 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
22b70 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
22b80 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
22b90 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
22ba0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
22bb0 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
22bc0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
22bd0 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
22be0 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
22bf0 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
22c00 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
22c10 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
22c20 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
22c30 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
22c40 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
22c50 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
22c60 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
22c70 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
22c80 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
22c90 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
22ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
22cb0 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
22cc0 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
22cd0 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
22ce0 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
22cf0 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
22d00 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
22d10 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
22d20 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
22d30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
22d40 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
22d50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22d60 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
22d70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
22d80 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
22d90 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
22da0 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
22db0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
22dc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
22dd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
22de0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
22df0 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
22e00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
22e10 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
22e20 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
22e30 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
22e40 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
22e50 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
22e60 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Int.h */.){.  in
22e70 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
22e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22e90 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
22ea0 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
22eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
22ec0 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
22ed0 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
22ee0 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
22ef0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
22f00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22f10 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
22f20 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
22f30 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
22f40 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
22f50 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
22f60 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
22f70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
22f80 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
22f90 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
22fa0 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
22fb0 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
22fc0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
22fd0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
22fe0 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
22ff0 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
23000 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
23010 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f   *pMaskSet;    /
23020 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
23030 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
23040 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23060 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
23070 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
23080 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
23090 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
230a0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
230b0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
230c0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
230d0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
230e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
230f0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
23100 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
23110 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
23120 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
23130 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
23140 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
23150 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
23160 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
23170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23180 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
23190 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b  n of all pWC->a[
231a0 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73  ].wtFlags */.  s
231b0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
231c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
231d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
231e0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
231f0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
23200 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23210 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
23220 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
23230 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
23240 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28  mask .  */.  if(
23250 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
23260 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
23270 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23280 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
23290 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
232a0 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
232b0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
232c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
232d0 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
232e0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
232f0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
23300 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
23310 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
23320 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
23330 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
23340 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
23350 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
23360 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
23370 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
23380 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
23390 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
233a0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
233b0 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
233c0 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
233d0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
233e0 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
233f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23400 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
23410 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
23420 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
23430 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
23440 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
23450 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
23460 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
23470 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
23480 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
23490 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
234a0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
234b0 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
234c0 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
234d0 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
234e0 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
234f0 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
23500 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
23510 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
23520 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
23530 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
23540 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
23550 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
23560 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
23570 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
23580 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
23590 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
235a0 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
235b0 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
235c0 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
235d0 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57  se->db;.  nByteW
235e0 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
235f0 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
23600 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
23610 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
23620 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
23630 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23640 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74  (db, .      nByt
23650 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20  eWInfo + .      
23660 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75  sizeof(WhereClau
23670 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65  se) +.      size
23680 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29  of(WhereMaskSet)
23690 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
236a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
236b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
236c0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
236d0 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
236e0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
236f0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
23700 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
23710 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
23720 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
23730 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
23740 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
23750 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
23760 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
23770 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23780 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20    pWInfo->pWC = 
23790 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75  pWC = (WhereClau
237a0 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49  se *)&((u8 *)pWI
237b0 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d  nfo)[nByteWInfo]
237c0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
237d0 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
237e0 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
237f0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
23800 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
23810 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
23820 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  = (WhereMaskSet*
23830 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20  )&pWC[1];..  /* 
23840 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
23850 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
23860 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
23870 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
23880 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
23890 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
238a0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
238b0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
238c0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
238d0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
238e0 69 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20  it(pWC, pParse, 
238f0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
23900 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
23910 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
23920 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
23930 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c  lit(pWC, pWhere,
23940 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
23950 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
23960 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
23970 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
23980 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
23990 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
239a0 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
239b0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
239c0 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
239d0 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
239e0 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69  Where && (nTabLi
239f0 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
23a00 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
23a10 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
23a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
23a30 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
23a40 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
23a50 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  >iBreak, SQLITE_
23a60 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23a70 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
23a80 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
23a90 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
23aa0 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
23ab0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
23ac0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
23ad0 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
23ae0 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
23af0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
23b00 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
23b10 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
23b20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
23b30 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
23b40 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
23b50 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
23b60 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
23b70 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
23b80 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
23b90 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
23ba0 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
23bb0 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
23bc0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
23bd0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
23be0 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
23bf0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
23c00 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
23c10 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
23c20 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
23c30 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
23c40 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
23c50 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
23c60 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
23c70 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
23c80 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
23c90 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
23ca0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
23cb0 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
23cc0 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
23cd0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
23ce0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
23cf0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
23d00 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
23d10 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
23d20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57 68  Configure the Wh
23d30 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20  ereClause.vmask 
23d40 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74  variable so that
23d50 20 62 69 74 73 20 74 68 61 74 20 63 6f 72 72 65   bits that corre
23d60 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69  spond.  ** to vi
23d70 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
23d80 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  ors are set. Thi
23d90 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c  s is used to sel
23da0 65 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65  ectively disable
23db0 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f   .  ** the OR-to
23dc0 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  -IN transformati
23dd0 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a  on in exprAnalyz
23de0 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73  eOrTerm(). It is
23df0 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20   not helpful .  
23e00 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  ** with virtual 
23e10 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
23e20 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
23e30 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
23e40 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
23e50 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
23e60 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
23e70 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
23e80 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
23e90 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
23ea0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
23eb0 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
23ec0 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
23ed0 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
23ee0 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
23ef0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
23f00 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
23f10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23f20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26  pWC->vmask==0 &&
23f30 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20   pMaskSet->n==0 
23f40 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23f50 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
23f60 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
23f70 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
23f80 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
23f90 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20  ursor);.#ifndef 
23fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23fb0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
23fc0 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74   ALWAYS(pTabList
23fd0 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20  ->a[i].pTab) && 
23fe0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69  IsVirtual(pTabLi
23ff0 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29  st->a[i].pTab) )
24000 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61  {.      pWC->vma
24010 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  sk |= ((Bitmask)
24020 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  1 << i);.    }.#
24030 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65  endif.  }.#ifnde
24040 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
24050 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
24060 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
24070 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
24080 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
24090 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
240a0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
240b0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
240c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
240d0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
240e0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
240f0 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
24100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
24110 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
24120 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
24130 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
24140 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
24150 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
24160 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
24170 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
24180 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
24190 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
241a0 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
241b0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
241c0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
241d0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
241e0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
241f0 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
24200 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
24210 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
24220 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
24230 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
24240 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
24250 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66  List, pWC);.  if
24260 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24270 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
24280 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
24290 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
242a0 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
242b0 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
242c0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
242d0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
242e0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
242f0 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
24300 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
24310 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
24320 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
24330 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
24340 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
24350 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
24360 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73    pWInfo->a[].ws
24370 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78  Flags   WHERE_xx
24380 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
24390 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
243a0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
243b0 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
243c0 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
243d0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
243e0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
243f0 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68  .iFrom     Which
24400 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
24410 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
24420 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
24430 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
24440 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
24450 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
24460 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
24470 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
24480 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
24490 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
244a0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57   index.  **   pW
244b0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20  Info->a[].pTerm 
244c0 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73      When wsFlags
244d0 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d  ==WO_OR, the OR-
244e0 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a  clause term.  **
244f0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
24500 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
24510 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
24520 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
24530 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
24540 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
24550 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
24560 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
24570 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
24580 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
24590 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
245a0 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
245b0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
245c0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
245d0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
245e0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
245f0 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74  o->a; i<nTabList
24600 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
24610 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20  {.    WhereCost 
24620 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20  bestPlan;       
24630 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69    /* Most effici
24640 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f  ent plan seen so
24650 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65   far */.    Inde
24660 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
24670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24680 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
24690 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
246a0 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
246c0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
246d0 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
246e0 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20  /.    int bestJ 
246f0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
24700 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
24710 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  f j */.    Bitma
24720 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20  sk m;           
24730 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
24740 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72  k value for j or
24750 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e   bestJ */.    in
24760 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20  t isOptimal;    
24770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
24780 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61  rator for optima
24790 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65  l/non-optimal se
247a0 61 72 63 68 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  arch */..    mem
247b0 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30  set(&bestPlan, 0
247c0 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61  , sizeof(bestPla
247d0 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61  n));.    bestPla
247e0 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  n.rCost = SQLITE
247f0 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 20 20 2f  _BIG_DBL;..    /
24800 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
24810 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74  he remaining ent
24820 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
24830 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20   clause to find 
24840 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  the.    ** next 
24850 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65  nested loop. The
24860 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
24870 72 69 65 73 20 6d 61 79 20 62 65 20 69 74 65 72  ries may be iter
24880 61 74 65 64 20 74 68 72 6f 75 67 68 0a 20 20 20  ated through.   
24890 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65 20   ** either once 
248a0 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20 2a  or twice. .    *
248b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  *.    ** The fir
248c0 73 74 20 69 74 65 72 61 74 69 6f 6e 2c 20 77 68  st iteration, wh
248d0 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 70 65  ich is always pe
248e0 72 66 6f 72 6d 65 64 2c 20 73 65 61 72 63 68 65  rformed, searche
248f0 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  s for the.    **
24900 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
24910 72 79 20 74 68 61 74 20 70 65 72 6d 69 74 73 20  ry that permits 
24920 74 68 65 20 6c 6f 77 65 73 74 2d 63 6f 73 74 2c  the lowest-cost,
24930 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e   "optimal" scan.
24940 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   In.    ** this 
24950 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d  context an optim
24960 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74  al scan is one t
24970 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d  hat uses the sam
24980 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a  e strategy.    *
24990 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * for the given 
249a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
249b0 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65  y as would be se
249c0 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e  lected if the en
249d0 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20  try.    ** were 
249e0 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65  used as the inne
249f0 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f  rmost nested loo
24a00 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  p.  In other wor
24a10 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20  ds, a table.    
24a20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63  ** is chosen suc
24a30 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  h that the cost 
24a40 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20  of running that 
24a50 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
24a60 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62  reduced.    ** b
24a70 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74  y waiting for ot
24a80 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75  her tables to ru
24a90 6e 20 66 69 72 73 74 2e 0a 20 20 20 20 2a 2a 0a  n first..    **.
24aa0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
24ab0 64 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f  d iteration is o
24ac0 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66  nly performed if
24ad0 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   no optimal scan
24ae0 20 73 74 72 61 74 65 67 69 65 73 0a 20 20 20 20   strategies.    
24af0 2a 2a 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79  ** were found by
24b00 20 74 68 65 20 66 69 72 73 74 2e 20 54 68 69 73   the first. This
24b10 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 75 73   iteration is us
24b20 65 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ed to search for
24b30 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   the.    ** lowe
24b40 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65  st cost scan ove
24b50 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rall..    **.   
24b60 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72   ** Previous ver
24b70 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
24b80 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74  performed only t
24b90 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
24ba0 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65  ion -.    ** the
24bb0 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20   next outermost 
24bc0 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20  loop was always 
24bd0 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f  that with the lo
24be0 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20  west overall.   
24bf0 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65   ** cost. Howeve
24c00 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68  r, this meant th
24c10 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20  at SQLite could 
24c20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67  select the wrong
24c30 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72   plan.    ** for
24c40 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61 73   scripts such as
24c50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
24c60 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a      **   .    **
24c70 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
24c80 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a  t1(a, b); .    *
24c90 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
24ca0 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a   t2(c, d);.    *
24cb0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
24cc0 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  M t2, t1 WHERE t
24cd0 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a  2.rowid = t1.a;.
24ce0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
24cf0 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79 20  e best strategy 
24d00 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  is to iterate th
24d10 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20 66  rough table t1 f
24d20 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74  irst. However it
24d30 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  .    ** is not p
24d40 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72  ossible to deter
24d50 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20 61  mine this with a
24d60 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61   simple greedy a
24d70 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a  lgorithm..    **
24d80 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
24d90 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
24da0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
24db0 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68  h table t2 is th
24dc0 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61  e same .    ** a
24dd0 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  s the cost of a 
24de0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
24df0 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20  ugh table t1, a 
24e00 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20  simple greedy . 
24e10 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20     ** algorithm 
24e20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73  may choose to us
24e30 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74  e t2 for the out
24e40 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69  er loop, which i
24e50 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20  s a much.    ** 
24e60 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63  costlier approac
24e70 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  h..    */.    fo
24e80 72 28 69 73 4f 70 74 69 6d 61 6c 3d 31 3b 20 69  r(isOptimal=1; i
24e90 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62  sOptimal>=0 && b
24ea0 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61  estJ<0; isOptima
24eb0 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  l--){.      Bitm
24ec0 61 73 6b 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70  ask mask = (isOp
24ed0 74 69 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f 74 52  timal ? 0 : notR
24ee0 65 61 64 79 29 3b 0a 20 20 20 20 20 20 61 73 73  eady);.      ass
24ef0 65 72 74 28 20 28 6e 54 61 62 4c 69 73 74 2d 69  ert( (nTabList-i
24f00 46 72 6f 6d 29 3e 31 20 7c 7c 20 69 73 4f 70 74  From)>1 || isOpt
24f10 69 6d 61 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f  imal );.      fo
24f20 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
24f30 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
24f40 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b  [j]; j<nTabList;
24f50 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
24f60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ){.        int d
24f70 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20  oNotReorder;    
24f80 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
24f90 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74  table should not
24fa0 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f   be reordered */
24fb0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f  .        WhereCo
24fc0 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a  st sCost;     /*
24fd0 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f   Cost informatio
24fe0 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74  n from best[Virt
24ff0 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20  ual]Index() */. 
25000 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
25010 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f  *pOrderBy;  /* O
25020 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
25030 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69  or index to opti
25040 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20  mize */.  .     
25050 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
25060 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
25070 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
25080 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
25090 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d  .        if( j!=
250a0 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65  iFrom && doNotRe
250b0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
250c0 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61         m = getMa
250d0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
250e0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
250f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 20  .        if( (m 
25100 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
25110 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
25120 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
25130 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
25140 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25150 7d 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  }.        pOrder
25160 42 79 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70  By = ((i==0 && p
25170 70 4f 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72  pOrderBy )?*ppOr
25180 64 65 72 42 79 3a 30 29 3b 0a 20 20 0a 20 20 20  derBy:0);.  .   
25190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
251a0 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23  bItem->pTab );.#
251b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
251c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
251d0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
251e0 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e  rtual(pTabItem->
251f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
25200 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
25210 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57  _info **pp = &pW
25220 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49  Info->a[j].pIdxI
25230 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62  nfo;.          b
25240 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
25250 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61  pParse, pWC, pTa
25260 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72  bItem, mask, pOr
25270 64 65 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70  derBy, &sCost, p
25280 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
25290 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
252a0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65    {.          be
252b0 73 74 42 74 72 65 65 49 6e 64 65 78 28 70 50 61  stBtreeIndex(pPa
252c0 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
252d0 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72  em, mask, pOrder
252e0 42 79 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20  By, &sCost);.   
252f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
25300 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c  ssert( isOptimal
25310 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26   || (sCost.used&
25320 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a  notReady)==0 );.
25330 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73 43  .        if( (sC
25340 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64  ost.used&notRead
25350 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  y)==0.         &
25360 26 20 28 6a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 73  & (j==iFrom || s
25370 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50  Cost.rCost<bestP
25380 6c 61 6e 2e 72 43 6f 73 74 29 20 0a 20 20 20 20  lan.rCost) .    
25390 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
253a0 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73   bestPlan = sCos
253b0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  t;.          bes
253c0 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
253d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 6f  }.        if( do
253e0 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
253f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25400 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65  }.    assert( be
25410 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  stJ>=0 );.    as
25420 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26  sert( notReady &
25430 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
25440 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
25450 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
25460 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
25470 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
25480 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25   selects table %
25490 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22  d for loop %d\n"
254a0 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20  , bestJ,.       
254b0 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66      pLevel-pWInf
254c0 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20  o->a));.    if( 
254d0 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
254e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
254f0 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
25500 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
25510 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
25520 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c  dFlags &= bestPl
25530 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  an.plan.wsFlags;
25540 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  .    pLevel->pla
25550 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  n = bestPlan.pla
25560 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  n;.    testcase(
25570 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
25580 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25590 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65  NDEXED );.    te
255a0 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e  stcase( bestPlan
255b0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
255c0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
255d0 20 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74   );.    if( best
255e0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
255f0 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
25600 45 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e  ED|WHERE_TEMP_IN
25610 44 45 58 29 20 29 7b 0a 20 20 20 20 20 20 70 4c  DEX) ){.      pL
25620 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
25630 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
25640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25650 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
25660 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
25670 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
25680 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
25690 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
256a0 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
256b0 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
256c0 20 28 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20   (u8)bestJ;.    
256d0 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 6e 52 6f  if( bestPlan.nRo
256e0 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 20 70  w>=(double)1 ) p
256f0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
25700 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 6e 52  p *= bestPlan.nR
25710 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  ow;..    /* Chec
25720 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61  k that if the ta
25730 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ble scanned by t
25740 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  his loop iterati
25750 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a  on had an.    **
25760 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
25770 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  se attached to i
25780 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65  t, that the name
25790 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67  d index is being
257a0 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  .    ** used for
257b0 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f   the scan. If no
257c0 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f  t, then query co
257d0 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61  mpilation has fa
257e0 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74  iled..    ** Ret
257f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
25800 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20    */.    pIdx = 
25810 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
25820 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  J].pIndex;.    i
25830 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
25840 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
25850 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
25860 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
25870 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25880 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25890 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69  e, "cannot use i
258a0 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d  ndex: %s", pIdx-
258b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
258c0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
258d0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c  Error;.      }el
258e0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
258f0 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  f an INDEXED BY 
25900 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20  clause is used, 
25910 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  the bestIndex() 
25920 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  function is.    
25930 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
25940 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  d to find the in
25950 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e  dex specified in
25960 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
25970 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
25980 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20  * if it find an 
25990 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f  index at all. */
259a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
259b0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75   bestPlan.plan.u
259c0 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20  .pIdx==pIdx );. 
259d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
259e0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
259f0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
25a00 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
25a10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
25a20 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
25a30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
25a40 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
25a50 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
25a60 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
25a70 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
25a80 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
25a90 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
25aa0 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
25ab0 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
25ac0 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
25ad0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
25ae0 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
25af0 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79  {.    *ppOrderBy
25b00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
25b10 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
25b20 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
25b30 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
25b40 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
25b50 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
25b60 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
25b70 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
25b80 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
25b90 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
25ba0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
25bb0 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
25bc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25bd0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
25be0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
25bf0 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
25c00 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
25c10 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
25c20 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
25c30 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
25c40 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
25c50 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
25c60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25c70 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
25c80 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
25c90 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
25ca0 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
25cb0 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
25cc0 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
25cd0 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
25ce0 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
25cf0 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
25d00 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
25d10 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
25d20 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
25d30 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
25d40 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
25d50 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
25d60 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
25d70 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
25d80 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
25d90 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
25da0 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74  er Goto */.  not
25db0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
25dc0 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  k)0;.  for(i=0, 
25dd0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
25de0 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
25df0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
25e00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
25e10 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
25e20 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
25e30 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
25e40 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
25e50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
25e60 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e  e/index */..#ifn
25e70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25e80 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20  EXPLAIN.    if( 
25e90 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
25ea0 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =2 ){.      char
25eb0 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74   *zMsg;.      st
25ec0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25ed0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
25ee0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
25ef0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d  iFrom];.      zM
25f00 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
25f10 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25  ntf(db, "TABLE %
25f20 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
25f30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
25f40 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
25f50 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
25f60 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
25f70 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73   zMsg, "%s AS %s
25f80 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
25f90 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
25fa0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (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 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
25fd0 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
25fe0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
25ff0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
26000 73 67 2c 20 22 25 73 20 57 49 54 48 20 41 55 54  sg, "%s WITH AUT
26010 4f 4d 41 54 49 43 20 49 4e 44 45 58 22 2c 20 7a  OMATIC INDEX", z
26020 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
26030 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
26040 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
26050 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
26060 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
26070 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
26080 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
26090 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 0a  WITH INDEX %s",.
260a0 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c             zMsg,
260b0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
260c0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
260d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
260e0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
260f0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
26100 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OR ){.        z
26110 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
26120 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
26130 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49 4e  "%s VIA MULTI-IN
26140 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73 67  DEX UNION", zMsg
26150 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
26160 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
26170 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
26180 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
26190 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
261a0 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
261b0 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
261c0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
261d0 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  NG PRIMARY KEY",
261e0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
261f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26200 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26210 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
26220 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
26230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
26240 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
26250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26260 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
26270 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
26280 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
26290 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  ;.        zMsg =
262a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
262b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56  (db, zMsg, "%s V
262c0 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
262d0 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c  EX %d:%s", zMsg,
262e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
262f0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69       pVtabIdx->i
26300 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d  dxNum, pVtabIdx-
26310 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  >idxStr);.      
26320 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
26330 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
26340 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26350 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20  ORDERBY ){.     
26360 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
26370 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
26380 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59  sg, "%s ORDER BY
26390 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
263a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
263b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
263c0 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76  Explain, i, pLev
263d0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d  el->iFrom, 0, zM
263e0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
263f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
26400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
26410 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62  LAIN */.    pTab
26420 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
26430 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
26440 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  m];.    pTab = p
26450 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
26460 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
26470 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
26480 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 44 62 20  Cursor;.    iDb 
26490 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
264a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
264b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
264c0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
264d0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
264e0 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
264f0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
26500 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
26510 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
26520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
26530 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
26540 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
26550 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
26560 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
26570 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
26580 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
26590 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
265a0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
265b0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
265c0 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
265d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
265e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
265f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
26600 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
26610 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
26620 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
26630 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
26640 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
26650 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
26660 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
26670 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
26680 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
26690 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
266a0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
266b0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
266c0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
266d0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
266e0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
266f0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
26700 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
26710 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20   op);.      if( 
26720 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
26730 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
26740 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
26750 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
26760 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
26770 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
26780 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
26790 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
267a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
267b0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
267c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
267d0 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
26800 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
26810 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
26820 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
26830 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
26840 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
26850 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
26860 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
26870 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
26880 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
26890 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
268a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
268b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
268c0 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  P_INDEX)!=0 ){. 
268d0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 54 72       constructTr
268e0 61 6e 73 69 65 6e 74 49 6e 64 65 78 28 70 50 61  ansientIndex(pPa
268f0 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
26900 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  em, notReady, pL
26910 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  evel);.    }else
26920 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
26930 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
26940 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
26950 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
26960 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Ix = pLevel->pla
26970 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
26980 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
26990 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
269a0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
269b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  ;.      int iIdx
269c0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
269d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  dxCur;.      ass
269e0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
269f0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
26a00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
26a10 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ( iIdxCur>=0 );.
26a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26a30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
26a40 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
26a50 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
26a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a70 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
26a80 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
26a90 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
26aa0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26ab0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
26ac0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
26ad0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
26ae0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
26af0 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  Db);.    notRead
26b00 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57  y &= ~getMask(pW
26b10 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  C->pMaskSet, pTa
26b20 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
26b30 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
26b40 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
26b50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26b60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
26b70 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  the code to do t
26b80 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68  he search.  Each
26b90 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
26ba0 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20  e for.  ** loop 
26bb0 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20  below generates 
26bc0 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
26bd0 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  e nested loop of
26be0 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f   the VM.  ** pro
26bf0 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  gram..  */.  not
26c00 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
26c10 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  k)0;.  for(i=0; 
26c20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29  i<nTabList; i++)
26c30 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  {.    notReady =
26c40 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
26c50 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74  t(pWInfo, i, wct
26c60 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64  rlFlags, notRead
26c70 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
26c80 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e  iContinue = pWIn
26c90 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e  fo->a[i].addrCon
26ca0 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
26cb0 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
26cc0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
26cd0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
26ce0 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
26cf0 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
26d00 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
26d10 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
26d20 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
26d30 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
26d40 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
26d50 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
26d60 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
26d70 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
26d80 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
26d90 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
26da0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
26db0 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
26dc0 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
26dd0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
26de0 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
26df0 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
26e00 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
26e10 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  0; i<nTabList; i
26e20 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
26e30 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
26e40 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
26e50 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
26e60 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
26e70 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
26e80 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
26e90 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
26ea0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
26eb0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
26ec0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
26ed0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
26ee0 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
26ef0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
26f00 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
26f10 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
26f20 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
26f30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26f40 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
26f50 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
26f60 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
26f70 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29  QPlan], "{}", 2)
26f80 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
26f90 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
26fa0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
26fb0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
26fc0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
26fd0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  z, n);.        n
26fe0 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
26ff0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
27000 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
27010 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
27020 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
27030 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
27040 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
27050 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74  OWID_EQ );.    t
27060 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
27070 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
27080 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
27090 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
270a0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
270b0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
270c0 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
270d0 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
270e0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
270f0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
27100 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20  n], "* ", 2);.  
27110 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
27120 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
27130 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
27140 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
27150 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
27160 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
27170 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
27180 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
27190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
271a0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
271b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
271c0 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
271d0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
271e0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
271f0 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
27200 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
27210 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
27220 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
27230 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
27240 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
27250 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
27260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
27270 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
27280 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
27290 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
272a0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
272b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
272c0 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
272d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
272e0 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
272f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27300 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
27310 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
27320 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
27330 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
27340 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
27350 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
27360 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
27370 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
27380 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
27390 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
273a0 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
273b0 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
273c0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
273d0 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
273e0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
273f0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
27400 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
27410 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
27420 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
27430 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
27440 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
27450 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
27460 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
27470 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
27480 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
27490 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
274a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
274b0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
274c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
274d0 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
274e0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
274f0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
27500 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
27510 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
27520 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27530 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
27540 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
27550 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
27560 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
27570 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
27580 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
27590 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
275a0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
275b0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
275c0 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
275d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
275e0 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
275f0 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
27600 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
27610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27620 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
27630 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
27640 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
27650 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
27660 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
27670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
27680 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27690 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
276a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
276b0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
276c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
276d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
276e0 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
276f0 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
27700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27710 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27720 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
27730 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
27740 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
27750 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
27760 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
27770 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
27780 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
27790 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
277a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
277b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
277c0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
277d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
277e0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
277f0 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
27800 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
27810 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
27820 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27830 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27840 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
27850 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
27860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27870 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
27880 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
27890 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
278a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
278b0 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
278c0 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
278d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
278e0 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
278f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
27900 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
27910 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27920 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
27930 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
27940 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
27950 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
27960 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
27970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27980 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
27990 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
279a0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
279b0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
279c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
279d0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
279e0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
279f0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
27a00 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
27a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
27a20 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
27a30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27a40 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
27a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27a60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
27a70 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
27a80 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
27a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27aa0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
27ab0 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
27ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27ad0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
27ae0 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
27af0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
27b00 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
27b10 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
27b20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27b30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27b40 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
27b50 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
27b60 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
27b70 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
27b80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
27b90 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
27ba0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
27bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27bc0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
27bd0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
27be0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
27bf0 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
27c00 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
27c10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
27c20 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
27c30 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
27c40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27c50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
27c60 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
27c70 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
27c80 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
27c90 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
27ca0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
27cb0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
27cc0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
27cd0 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
27ce0 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
27cf0 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
27d00 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
27d10 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
27d20 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
27d30 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
27d40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27d50 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
27d60 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
27d70 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
27d80 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
27d90 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
27da0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
27db0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
27dc0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
27dd0 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
27de0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
27df0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
27e00 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
27e10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
27e20 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  IT_CLOSE)==0 ){.
27e30 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
27e40 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
27e50 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ags;.      if( !
27e60 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
27e70 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52 45  s && (ws & WHERE
27e80 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
27e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27ea0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
27eb0 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d  _Close, pTabItem
27ec0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
27ed0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 77    }.      if( (w
27ee0 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
27ef0 45 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e  ED|WHERE_TEMP_IN
27f00 44 45 58 29 29 20 3d 3d 20 57 48 45 52 45 5f 49  DEX)) == WHERE_I
27f10 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
27f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27f30 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
27f40 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
27f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27f60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
27f70 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
27f80 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73  dex, make code s
27f90 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20  ubstitutions to 
27fa0 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a  read data.    **
27fb0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
27fc0 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f  in preference to
27fd0 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65   the table. Some
27fe0 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e  times, this mean
27ff0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62  s.    ** the tab
28000 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65  le need never be
28010 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73   read from. This
28020 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   is a performanc
28030 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20  e boost,.    ** 
28040 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65  as the vdbe leve
28050 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68  l waits until th
28060 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20  e table is read 
28070 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a  before actually.
28080 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74      ** seeking t
28090 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  he table cursor 
280a0 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  to the record co
280b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
280c0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
280d0 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  * position in th
280e0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20  e index..    ** 
280f0 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
28100 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
28110 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
28120 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28130 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
28140 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
28150 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
28160 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
28170 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
28180 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
28190 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
281a0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
281b0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
281c0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
281d0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
281e0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
281f0 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
28200 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
28210 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
28220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28230 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
28240 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28250 44 45 58 45 44 29 21 3d 30 20 26 26 20 21 64 62  DEXED)!=0 && !db
28260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b  ->mallocFailed){
28270 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
28280 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
28290 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
282a0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
282b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
282c0 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  x;..      assert
282d0 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
282e0 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
282f0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
28300 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
28310 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
28320 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28330 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
28340 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
28350 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
28360 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28370 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
28380 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
28390 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
283a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
283b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
283c0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
283d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
283e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
283f0 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
28400 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
28410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28420 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
28430 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
28440 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
28450 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
28460 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
28490 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e  ssert( (pLevel->
284a0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
284b0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
284c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
284d0 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c   || j<pIdx->nCol
284e0 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  umn );.        }
284f0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
28500 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
28510 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
28520 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
28530 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
28540 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
28550 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
28560 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28570 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
28580 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
28590 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
285a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
285b0 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
285c0 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
285d0 70 3b 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f  p;.    whereInfo
285e0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
285f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
28600 7d 0a                                            }.