/ Hex Artifact Content
Login

Artifact ddfe0e1ac1a2c9d382b1df5bd6f9e2b0282ecc39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0350: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0370: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0380: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
03a0: 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
03b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
03c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
03e0: 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57 48  BUG).# define WH
03f0: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0410: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0420: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0430: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0440: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
0450: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
0460: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
0470: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
0480: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0490: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04a0: 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61  eMaskSet WhereMa
04b0: 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73  skSet;.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
04d0: 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74  o WhereOrInfo;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65  ereAndInfo Where
0500: 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  AndInfo;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73   struct WhereCos
0520: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
0530: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0540: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0550: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0560: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0570: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0580: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0590: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
05a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05b0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05c0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05e0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05f0: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
0600: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
0610: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
0620: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
0630: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
0640: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
0650: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
0660: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
0670: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0680: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
0690: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
06a0: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
06b0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
06c0: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
06d0: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
06e0: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
06f0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
0700: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
0710: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
0720: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
0730: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
0740: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
0750: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
0760: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
0770: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
0780: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
0790: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
07a0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07b0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07d0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07e0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
07f0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
0800: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
0810: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
0820: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
0830: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
0840: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
0850: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
0860: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
0870: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
0880: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
0890: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
08a0: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
08b0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
08c0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
08d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
08e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
08f0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
0900: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
0910: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
0920: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
0930: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
0940: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
0950: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
0960: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
0970: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
0980: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
0990: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
09a0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
09b0: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
09c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
09d0: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
09e0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
09f0: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
0a00: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
0a10: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
0a20: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
0a30: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
0a40: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
0a50: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
0a60: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
0a70: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
0a80: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
0a90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
0ab0: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
0ac0: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
0ad0: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
0ae0: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
0af0: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
0b00: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
0b10: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
0b20: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
0b30: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
0b40: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0b50: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0b60: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0b70: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0b80: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0b90: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
0ba0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0bb0: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0bc0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0bd0: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0be0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0bf0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0c00: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0c10: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0c20: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0c30: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0c40: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0c50: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0c60: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0c70: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0c80: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0c90: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0ca0: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0cb0: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0cc0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0cd0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ce0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0cf0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0d00: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
0d10: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
0d20: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
0d30: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
0d40: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
0d50: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
0d60: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
0d70: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
0d80: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
0d90: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
0da0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
0db0: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
0dc0: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
0dd0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
0de0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0df0: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
0e00: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
0e10: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
0e20: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0e30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
0e40: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e60: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
0e70: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
0e80: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
0e90: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
0ea0: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
0eb0: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
0ec0: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
0ed0: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
0ee0: 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
0ef0: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f00: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0f10: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0f20: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0f40: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0f50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
0f60: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
0f70: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
0f90: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
0fa0: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
0fb0: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
0fc0: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0fe0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
0ff0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
1000: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
1010: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
1020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
1030: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
1040: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
1050: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
1060: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
1070: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
1080: 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61  mation if eOpera
1090: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20  tor==WO_OR */.  
10a0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
10b0: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
10c0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
10d0: 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  f eOperator==WO_
10e0: 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  AND */.  } u;.  
10f0: 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  u16 eOperator;  
1100: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f          /* A WO_
1110: 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  xx value describ
1120: 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38  ing <op> */.  u8
1130: 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20   wtFlags;       
1140: 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78        /* TERM_xx
1150: 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65  x bit flags.  Se
1160: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20  e below */.  u8 
1170: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
1180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1190: 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20  f children that 
11a0: 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20  must disable us 
11b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11c0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20   *pWC;       /* 
11d0: 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20  The clause this 
11e0: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
11f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
1200: 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20  reqRight;    /* 
1210: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
1220: 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d  s used by pExpr-
1230: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
1240: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
1250: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
1260: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
1270: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
1280: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1290: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65  ed values of Whe
12a0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a  reTerm.wtFlags.*
12b0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
12c0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
12d0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
12e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f  te(db, pExpr) */
1300: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
1310: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
1320: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
1330: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
1340: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
1350: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
1360: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
1370: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
1380: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
1390: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
13a0: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
13b0: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
13c0: 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  ine TERM_ORINFO 
13d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65      0x10   /* Ne
13e0: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
13f0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
1400: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65  fo object */.#de
1410: 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46  fine TERM_ANDINF
1420: 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e  O    0x20   /* N
1430: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64  WhereTerm.u.pAnd
1450: 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66  Info obj */.#def
1460: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
1470: 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73      0x40   /* Us
1480: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
1490: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
14a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
14b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
14c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
14d0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
14e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
14f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1500: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1510: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1520: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1530: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1540: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1570: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1580: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
1590: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15a0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
15b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
15c0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
15d0: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15f0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1600: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1610: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1620: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1630: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1640: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
1650: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
1660: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1680: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1690: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16c0: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
16d0: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
16e0: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
16f0: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1700: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1710: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1720: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1730: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1740: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
1750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1760: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1770: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1780: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1790: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17a0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
17b0: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
17c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
17d0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17e0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17f0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1800: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1810: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1820: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1830: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1840: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1850: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1860: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1870: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1880: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1890: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
18b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
18c0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
18d0: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18e0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1900: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1910: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1920: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1930: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1940: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1950: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1960: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1970: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1980: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1990: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19a0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
19c0: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
19d0: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a10: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a20: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a40: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a50: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a60: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a80: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a90: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1aa0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1ab0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1ac0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1ad0: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1ae0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1af0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b00: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b10: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b20: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b30: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b40: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b50: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b60: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b70: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b80: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b90: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1ba0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1bb0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1bc0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1bd0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1be0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bf0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c00: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c10: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c20: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c50: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c60: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c70: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c80: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c90: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1ca0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1cb0: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1cc0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1cd0: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ce0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cf0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d00: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d20: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d30: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d40: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d50: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d80: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d90: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1da0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1db0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1dc0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1dd0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1de0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1df0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e00: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e20: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e30: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e40: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e60: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e70: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e80: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e90: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ea0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1eb0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1ec0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1ed0: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ee0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f10: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f20: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f30: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f50: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f60: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f70: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f80: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f90: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1fa0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1fb0: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1fc0: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1fd0: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fe0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1ff0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2000: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2010: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2020: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2030: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2040: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2050: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2060: 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75  y */.  Bitmask u
2070: 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  sed;      /* Bit
2080: 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  mask of cursors 
2090: 75 73 65 64 20 62 79 20 74 68 69 73 20 70 6c 61  used by this pla
20a0: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  n */.};../*.** B
20b0: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
20c0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
20d0: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
20e0: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
20f0: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
2100: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
2110: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
2120: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
2130: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
2140: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
2150: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
2160: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
2170: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
2180: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
2190: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
21a0: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
21b0: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
21c0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
21d0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
21e0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
21f0: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
2200: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
2210: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
2220: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2230: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
2240: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
2250: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
2260: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
2270: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2280: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
2290: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
22a0: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
22b0: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
22c0: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
22d0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
22e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
22f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2300: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2310: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2320: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2330: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2340: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2350: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2360: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2370: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2380: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2390: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
23a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
23b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
23c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
23d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
23e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
23f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2400: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2410: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2420: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2430: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2440: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2450: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2460: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2470: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2480: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2490: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
24a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
24b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
24c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
24d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
24e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
24f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2500: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2510: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2520: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2540: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2550: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2560: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2570: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2580: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2590: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
25a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
25b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
25c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
25d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
25e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
25f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2600: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2610: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2620: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2630: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2640: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2650: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2660: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2670: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2680: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2690: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
26a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
26b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
26c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
26d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
26e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
26f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2700: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2710: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2720: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2730: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2740: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2750: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2760: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2770: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2780: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2790: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
27a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
27b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
27c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
27d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
27e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
27f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2800: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2810: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2820: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2830: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2840: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2850: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2860: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2870: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2880: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2890: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
28a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
28b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
28d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
28e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
28f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2900: 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ine WHERE_IDX_ON
2910: 4c 59 20 20 20 20 20 30 78 30 30 38 30 30 30 30  LY     0x0080000
2920: 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20  0  /* Use index 
2930: 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c  only - omit tabl
2940: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  e */.#define WHE
2950: 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20  RE_ORDERBY      
2960: 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f  0x01000000  /* O
2970: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
2980: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
2990: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
29a0: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
29b0: 20 30 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20   0x02000000  /* 
29c0: 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
29d0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
29e0: 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20   WHERE_UNIQUE   
29f0: 20 20 20 20 30 78 30 34 30 30 30 30 30 30 20 20      0x04000000  
2a00: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
2a10: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
2a20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2a30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
2a40: 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65  08000000  /* Use
2a50: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70   virtual-table p
2a60: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65  rocessing */.#de
2a70: 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49  fine WHERE_MULTI
2a80: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30 30  _OR     0x100000
2a90: 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20  00  /* OR using 
2aa0: 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73  multiple indices
2ab0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2ac0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30  E_TEMP_INDEX   0
2ad0: 78 32 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x20000000  /* Us
2ae0: 65 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  es an ephemeral 
2af0: 69 6e 64 65 78 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  index */../*.** 
2b00: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
2b10: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
2b20: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
2b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b40: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
2b50: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2b60: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
2b70: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
2b80: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
2b90: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
2ba0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
2bb0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
2bc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
2bd0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2be0: 74 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t   /* Mapping f
2bf0: 72 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72  rom table cursor
2c00: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
2c10: 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  asks */.){.  pWC
2c20: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2c30: 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53  e;.  pWC->pMaskS
2c40: 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20  et = pMaskSet;. 
2c50: 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b   pWC->nTerm = 0;
2c60: 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20  .  pWC->nSlot = 
2c70: 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61  ArraySize(pWC->a
2c80: 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e  Static);.  pWC->
2c90: 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63  a = pWC->aStatic
2ca0: 3b 0a 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 3d  ;.  pWC->vmask =
2cb0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
2cc0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2cd0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2ce0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
2cf0: 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a  eClause*);../*.*
2d00: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  * Deallocate all
2d10: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
2d20: 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f  ed with a WhereO
2d30: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rInfo object..*/
2d40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2d50: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73  reOrInfoDelete(s
2d60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
2d70: 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  eOrInfo *p){.  w
2d80: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
2d90: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
2da0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
2db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
2dc0: 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  cate all memory 
2dd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2de0: 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f  a WhereAndInfo o
2df0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
2e00: 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e   void whereAndIn
2e10: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
2e20: 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e   *db, WhereAndIn
2e30: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2e40: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2e50: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2e60: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2e70: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2e80: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
2e90: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
2ea0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2eb0: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
2ec0: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
2ed0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2ee0: 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72   inverse of wher
2ef0: 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a  eClauseInit()..*
2f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2f10: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
2f20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
2f30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
2f40: 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c  reTerm *a;.  sql
2f50: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
2f60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
2f70: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
2f80: 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30  , a=pWC->a; i>=0
2f90: 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20  ; i--, a++){.   
2fa0: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
2fb0: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
2fc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2fd0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  xprDelete(db, a-
2fe0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
2ff0: 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67     if( a->wtFlag
3000: 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  s & TERM_ORINFO 
3010: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72  ){.      whereOr
3020: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61  InfoDelete(db, a
3030: 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20  ->u.pOrInfo);.  
3040: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77    }else if( a->w
3050: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e  tFlags & TERM_AN
3060: 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77  DINFO ){.      w
3070: 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74  hereAndInfoDelet
3080: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49  e(db, a->u.pAndI
3090: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nfo);.    }.  }.
30a0: 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57    if( pWC->a!=pW
30b0: 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20  C->aStatic ){.  
30c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
30d0: 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d  db, pWC->a);.  }
30e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
30f0: 73 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65  single new Where
3100: 54 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68  Term entry to th
3110: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3120: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65  ject pWC..** The
3130: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f   new WhereTerm o
3140: 62 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75  bject is constru
3150: 63 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70  cted from Expr p
3160: 20 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67   and with wtFlag
3170: 73 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  s..** The index 
3180: 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74  in pWC->a[] of t
3190: 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  he new WhereTerm
31a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
31b0: 73 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73  success..** 0 is
31c0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
31d0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63   new WhereTerm c
31e0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65  ould not be adde
31f0: 64 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72  d due to a memor
3200: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
3210: 65 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f  error.  The memo
3220: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
3230: 69 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65  ilure will be re
3240: 63 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65  corded in.** the
3250: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
3260: 64 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68  d flag so that h
3270: 69 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63  igher-level func
3280: 74 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74  tions can detect
3290: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   it..**.** This 
32a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63  routine will inc
32b0: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
32c0: 66 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  f the pWC->a[] a
32d0: 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
32e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
32f0: 77 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  wtFlags argument
3300: 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44   includes TERM_D
3310: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73  YNAMIC, then res
3320: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66  ponsibility.** f
3330: 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
3340: 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61  xpression p is a
3350: 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68  ssumed by the Wh
3360: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
3370: 20 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73   pWC..** This is
3380: 20 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68   true even if th
3390: 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
33a0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
33b0: 65 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ew WhereTerm..**
33c0: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68  .** WARNING:  Th
33d0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
33e0: 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20   reallocate the 
33f0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74  space used to st
3400: 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d  ore.** WhereTerm
3410: 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73  s.  All pointers
3420: 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73   to WhereTerms s
3430: 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64  hould be invalid
3440: 61 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61  ated after.** ca
3450: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
3460: 6e 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65  ne.  Such pointe
3470: 72 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74  rs may be reinit
3480: 69 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72  ialized by refer
3490: 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57  encing.** the pW
34a0: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  C->a[] array..*/
34b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
34c0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68  eClauseInsert(Wh
34d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
34e0: 45 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c  Expr *p, u8 wtFl
34f0: 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72  ags){.  WhereTer
3500: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
3510: 69 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28  idx;.  testcase(
3520: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
3530: 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 45  VIRTUAL );  /* E
3540: 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30  V: R-00211-15100
3550: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e   */.  if( pWC->n
3560: 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74  Term>=pWC->nSlot
3570: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
3580: 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61  m *pOld = pWC->a
3590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
35a0: 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d  b = pWC->pParse-
35b0: 3e 64 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  >db;.    pWC->a 
35c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
35d0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
35e0: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
35f0: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
3600: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
3610: 20 20 20 20 20 20 69 66 28 20 77 74 46 6c 61 67        if( wtFlag
3620: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
3630: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3640: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3650: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , p);.      }.  
3660: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c      pWC->a = pOl
3670: 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
3680: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  0;.    }.    mem
3690: 63 70 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64  cpy(pWC->a, pOld
36a0: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
36b0: 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b  0])*pWC->nTerm);
36c0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70  .    if( pOld!=p
36d0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
36e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
36f0: 65 65 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20  ee(db, pOld);.  
3700: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
3710: 6f 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ot = sqlite3DbMa
3720: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43  llocSize(db, pWC
3730: 2d 3e 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d  ->a)/sizeof(pWC-
3740: 3e 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54  >a[0]);.  }.  pT
3750: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
3760: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  x = pWC->nTerm++
3770: 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  ];.  pTerm->pExp
3780: 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e  r = p;.  pTerm->
3790: 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67  wtFlags = wtFlag
37a0: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
37b0: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
37c0: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
37d0: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
37e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37f0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
3800: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
3810: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3820: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
3830: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
3840: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
3850: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
3860: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
3870: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
3880: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
3890: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
38a0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
38b0: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
38c0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
38d0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
38e0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
38f0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
3900: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
3910: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
3920: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
3930: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
3940: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
3950: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
3960: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
3970: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
3980: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
3990: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
39a0: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
39b0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
39c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
39d0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
39e0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
39f0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
3a00: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
3a10: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
3a20: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
3a30: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
3a40: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
3a50: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
3a60: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
3a70: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
3a80: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
3a90: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
3aa0: 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c  ] array.  The sl
3ab0: 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73  ot[] array grows
3ac0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f   as needed to co
3ad0: 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72  ntain.** all ter
3ae0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
3af0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
3b00: 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69  c void whereSpli
3b10: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
3b20: 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  WC, Expr *pExpr,
3b30: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d   int op){.  pWC-
3b40: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  >op = (u8)op;.  
3b50: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
3b60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
3b70: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
3b80: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
3b90: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
3ba0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
3bb0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
3bc0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
3bd0: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
3be0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
3bf0: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
3c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
3c10: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
3c20: 6e 20 6d 61 73 6b 20 73 65 74 20 28 61 20 57 68  n mask set (a Wh
3c30: 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63  ereMaskSet objec
3c40: 74 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  t).*/.#define in
3c50: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65  itMaskSet(P)  me
3c60: 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f  mset(P, 0, sizeo
3c70: 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  f(*P))../*.** Re
3c80: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
3c90: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
3ca0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
3cb0: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
3cc0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
3cd0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
3ce0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
3cf0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
3d00: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
3d10: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
3d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
3d30: 6b 53 65 74 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28  kSet->n<=sizeof(
3d40: 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  Bitmask)*8 );.  
3d50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
3d60: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
3d70: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
3d80: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
3d90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
3da0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (Bitmask)1)<<i;.
3db0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3dc0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
3dd0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
3de0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
3df0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
3e00: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
3e10: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
3e20: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
3e30: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
3e40: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
3e50: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
3e60: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
3e70: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
3e80: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
3e90: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
3ea0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
3eb0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
3ec0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
3ed0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
3ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
3ef0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
3f00: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
3f10: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
3f20: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
3f30: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
3f40: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
3f50: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
3f60: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
3f70: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
3f80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3f90: 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c  alks (recursivel
3fa0: 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  y) an expression
3fb0: 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61   tree and genera
3fc0: 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  tes.** a bitmask
3fd0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
3fe0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
3ff0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
4000: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a  sion.** tree..**
4010: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
4020: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
4030: 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69   work, the calli
4040: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
4050: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
4060: 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69  sly invoked sqli
4070: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
4080: 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70  mes() on the exp
4090: 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a  ression.  See.**
40a0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
40b0: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
40c0: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
40d0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
40e0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  ** The sqlite3Re
40f0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
4100: 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20   routines looks 
4110: 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  for column names
4120: 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65   and.** sets the
4130: 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b  ir opcodes to TK
4140: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69  _COLUMN and thei
4150: 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  r Expr.iTable fi
4160: 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56  elds to.** the V
4170: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
4180: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  r of the table. 
4190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
41a0: 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61  st has to.** tra
41b0: 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f  nslate the curso
41c0: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
41d0: 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e  itmask values an
41e0: 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  d OR all.** the 
41f0: 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65  bitmasks togethe
4200: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  r..*/.static Bit
4210: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
4220: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4230: 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  kSet*, ExprList*
4240: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
4250: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
4260: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
4270: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
4280: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4290: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68  xprTableUsage(Wh
42a0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
42b0: 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a  kSet, Expr *p){.
42c0: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
42d0: 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   0;.  if( p==0 )
42e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
42f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
4300: 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  N ){.    mask = 
4310: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
4320: 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  , p->iTable);.  
4330: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20    return mask;. 
4340: 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72   }.  mask = expr
4350: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4360: 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  Set, p->pRight);
4370: 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54  .  mask |= exprT
4380: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4390: 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  et, p->pLeft);. 
43a0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
43b0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
43c0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73  lect) ){.    mas
43d0: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
43e0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
43f0: 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  et, p->x.pSelect
4400: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4410: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4420: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4430: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  Set, p->x.pList)
4440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
4450: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
4460: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
4470: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4480: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4490: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
44a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69  ){.  int i;.  Bi
44b0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
44c0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
44d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
44e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
44f0: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
4500: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4510: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
4520: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
4530: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4540: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
4550: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63  itmask exprSelec
4560: 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  tTableUsage(Wher
4570: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
4580: 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b  et, Select *pS){
4590: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
45a0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
45b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
45c0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
45d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
45e0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61  >pEList);.    ma
45f0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
4600: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4610: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29  t, pS->pGroupBy)
4620: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
4630: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
4640: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4650: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61  OrderBy);.    ma
4660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
4670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4680: 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  S->pWhere);.    
4690: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
46a0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
46b0: 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20   pS->pHaving);. 
46c0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
46d0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
46e0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
46f0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4700: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
4710: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
4720: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
4730: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
4740: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
4750: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
4760: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
4770: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
4780: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
4790: 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49  =", ">=", and "I
47a0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  N"..**.** IMPLEM
47b0: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35  ENTATION-OF: R-5
47c0: 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62 65  9926-26393 To be
47d0: 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e   usable by an in
47e0: 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74 20  dex a term must 
47f0: 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66 20  be.** of one of 
4800: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
4810: 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65 78  rms: column = ex
4820: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
4830: 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  > expression.** 
4840: 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65 73  column >= expres
4850: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65 78  sion column < ex
4860: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
4870: 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  <= expression.**
4880: 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63 6f   expression = co
4890: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
48a0: 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  > column express
48b0: 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a  ion >= column.**
48c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63 6f   expression < co
48d0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
48e0: 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e  <= column column
48f0: 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73 69   IN.** (expressi
4900: 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e 20  on-list) column 
4910: 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63 6f  IN (subquery) co
4920: 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a  lumn IS NULL.*/.
4930: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
4940: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
4950: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
4960: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
4970: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4980: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
4990: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
49a0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
49b0: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
49c0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
49d0: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
49e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
49f0: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
4a00: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
4a10: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c   || op==TK_ISNUL
4a20: 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  L;.}../*.** Swap
4a30: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
4a40: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64  type TYPE..*/.#d
4a50: 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c  efine SWAP(TYPE,
4a60: 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20  A,B) {TYPE t=A; 
4a70: 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a  A=B; B=t;}../*.*
4a80: 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70  * Commute a comp
4a90: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
4aa0: 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66    Expressions of
4ab0: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20   the form "X op 
4ac0: 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72  Y".** are conver
4ad0: 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58  ted into "Y op X
4ae0: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f  "..**.** If a co
4af0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4b00: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
4b10: 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c  ith either the l
4b20: 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20  eft or right.** 
4b30: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
4b40: 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69  arison, it remai
4b50: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
4b60: 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65  th the same side
4b70: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f   after.** the co
4b80: 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59  mmutation. So "Y
4b90: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
4ba0: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a  op X" becomes .*
4bb0: 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  * "X collate NOC
4bc0: 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20  ASE op Y". This 
4bd0: 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  is because any c
4be0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4bf0: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
4c00: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
4c10: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
4c20: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
4c30: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
4c40: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
4c50: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
4c60: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
4c70: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61  P_ExpCollate fla
4c80: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
4c90: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
4ca0: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
4cb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4cc0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4cd0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
4ce0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4cf0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4d00: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
4d10: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
4d20: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
4d30: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
4d40: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
4d50: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
4d60: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
4d70: 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69   );.  pExpr->pRi
4d80: 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  ght->pColl = sql
4d90: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
4da0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
4db0: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
4dc0: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20  >pLeft->pColl = 
4dd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4de0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4df0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50  ->pLeft);.  SWAP
4e00: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
4e10: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
4e20: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
4e30: 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ll);.  pExpr->pR
4e40: 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70  ight->flags = (p
4e50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
4e60: 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c  ags & ~EP_ExpCol
4e70: 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b  late) | expLeft;
4e80: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
4e90: 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d  >flags = (pExpr-
4ea0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
4eb0: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
4ec0: 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57  | expRight;.  SW
4ed0: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
4ee0: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
4ef0: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
4f00: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
4f10: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
4f20: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
4f30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
4f40: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
4f50: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
4f60: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
4f70: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
4f80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4f90: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
4fa0: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
4fb0: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
4fc0: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
4fd0: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
4fe0: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
4ff0: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
5000: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
5010: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
5020: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
5030: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
5040: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
5050: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
5060: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
5070: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
5080: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
5090: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
50a0: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
50b0: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
50c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
50d0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
50e0: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
50f0: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
5100: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
5110: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5120: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
5130: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
5140: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5150: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
5160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5170: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
5180: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
5190: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
51a0: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
51b0: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
51c0: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
51d0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
51e0: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
51f0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5200: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
5210: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
5220: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
5230: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
5240: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
5250: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
5260: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
5270: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
5280: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
5290: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
52a0: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
52b0: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
52c0: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
52d0: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
52e0: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
52f0: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
5300: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5310: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
5320: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
5330: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
5340: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
5350: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
5360: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
5370: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
5380: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
5390: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
53a0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
53b0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
53c0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
53d0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
53e0: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
53f0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
5400: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
5410: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
5420: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
5430: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
5440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5450: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
5460: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
5470: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
5480: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
5490: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
54a0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
54b0: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
54c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
54d0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
54e0: 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72    int k;.  asser
54f0: 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20  t( iCur>=0 );.  
5500: 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20  op &= WO_ALL;.  
5510: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
5520: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
5530: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
5540: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
5550: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
5560: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
5570: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5580: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
5590: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
55a0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
55b0: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20  olumn.       && 
55c0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
55d0: 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29  r & op)!=0.    )
55e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
55f0: 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72   && pTerm->eOper
5600: 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator!=WO_ISNULL 
5610: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
5620: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
5630: 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  pr;.        Coll
5640: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
5650: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
5660: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
5670: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
5680: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
5690: 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64  rse;..        id
56a0: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
56b0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
56c0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
56d0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
56e0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
56f0: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
5700: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
5710: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5720: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
5730: 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20  quence required 
5740: 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f  from an index fo
5750: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  r.        ** it 
5760: 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72  to be useful for
5770: 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72   optimising expr
5780: 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65  ession pX. Store
5790: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
57a0: 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62   value in variab
57b0: 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20  le pColl..      
57c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
57d0: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
57e0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
57f0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
5800: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
5810: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
5820: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
5830: 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c      assert(pColl
5840: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
5850: 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  );..        for(
5860: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
5870: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
5880: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5890: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
58a0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
58b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
58c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
58d0: 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 53  Coll && sqlite3S
58e0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
58f0: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
5900: 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  l[j]) ) continue
5910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5920: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
5930: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5940: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
5950: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5960: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5970: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
5980: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
5990: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
59a0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
59b0: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
59c0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
59d0: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
59e0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
59f0: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
5a00: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
5a10: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
5a20: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
5a30: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
5a40: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
5a50: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
5a60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
5a70: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5a80: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
5a90: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
5aa0: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
5ab0: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
5ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5ad0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
5ae0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
5af0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5b00: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5b10: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
5b20: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
5b30: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
5b40: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
5b50: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
5b60: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
5b70: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
5b80: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
5b90: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
5ba0: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
5bb0: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
5bc0: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
5bd0: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
5be0: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
5bf0: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
5c00: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
5c10: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
5c20: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
5c30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
5c40: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5c50: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5c60: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
5c70: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
5c80: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5c90: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  on */.  Expr **p
5ca0: 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69  pPrefix,  /* Poi
5cb0: 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e  nter to TK_STRIN
5cc0: 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  G expression wit
5cd0: 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78  h pattern prefix
5ce0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f   */.  int *pisCo
5cf0: 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20  mplete, /* True 
5d00: 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64  if the only wild
5d10: 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65  card is % in the
5d20: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
5d30: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73  */.  int *pnoCas
5d40: 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e      /* True i
5d50: 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65  f uppercase is e
5d60: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77  quivalent to low
5d70: 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  ercase */.){.  c
5d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
5d90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ;         /* Str
5da0: 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49  ing on RHS of LI
5db0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
5dc0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
5dd0: 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52  pLeft;      /* R
5de0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
5df0: 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  ze of LIKE opera
5e00: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tor */.  ExprLis
5e10: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  t *pList;       
5e20: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f      /* List of o
5e30: 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c  perands to the L
5e40: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5e50: 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20    int c;        
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e70: 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  One character in
5e80: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   z[] */.  int cn
5e90: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5eb0: 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70  f non-wildcard p
5ec0: 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73  refix characters
5ed0: 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d   */.  char wc[3]
5ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ef0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61   /* Wildcard cha
5f00: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c  racters */.  sql
5f10: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5f20: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
5f30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
5f40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
5f50: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69  e *pVal = 0;.  i
5f60: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
5f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
5f80: 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f  ode of pRight */
5f90: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
5fa0: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
5fb0: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
5fc0: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
5fd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
5fe0: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
5ff0: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
6000: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
6010: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
6020: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
6030: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
6040: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
6050: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
6060: 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33 45  LUMN || sqlite3E
6070: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
6080: 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  t)!=SQLITE_AFF_T
6090: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d  EXT ){.    /* IM
60a0: 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35  P: R-02065-49465
60b0: 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
60c0: 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  ide of the LIKE 
60d0: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
60e0: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
60f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69  the name of an i
6100: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69  ndexed column wi
6110: 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  th TEXT affinity
6120: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
6130: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
6140: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21   pLeft->iColumn!
6150: 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61  =(-1) ); /* Beca
6160: 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61  use IPK never ha
6170: 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20  s AFF_TEXT */.. 
6180: 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d   pRight = pList-
6190: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f  >a[0].pExpr;.  o
61a0: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
61b0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
61c0: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20  ISTER ){.    op 
61d0: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20  = pRight->op2;. 
61e0: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
61f0: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
6200: 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65  Vdbe *pReprepare
6210: 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72   = pParse->pRepr
6220: 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69  epare;.    int i
6230: 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43  Col = pRight->iC
6240: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20  olumn;.    pVal 
6250: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
6260: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
6270: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
6280: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
6290: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
62a0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
62b0: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
62c0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
62d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
62e0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
62f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6300: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
6310: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
6320: 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  ol); /* IMP: R-2
6330: 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20  3257-02778 */.  
6340: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
6350: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
6360: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
6370: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
6390: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
63a0: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
63b0: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
63c0: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
63d0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
63e0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
63f0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
6400: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
6410: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
6420: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
6430: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
6440: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
6450: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
6460: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
6470: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
6480: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
6490: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
64a0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
64b0: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
64c0: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
64d0: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
64e0: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
64f0: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
6500: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
6510: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
6520: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
6530: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
6540: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
6550: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
6560: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
6570: 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f 2a 20 49 4d  >iColumn); /* IM
6580: 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38  P: R-23257-02778
6590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
65a0: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20  *pisComplete && 
65b0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
65c0: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
65d0: 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f   /* If the rhs o
65e0: 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65  f the LIKE expre
65f0: 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61  ssion is a varia
6600: 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ble, and the cur
6610: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
6620: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76  * value of the v
6630: 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68  ariable means th
6640: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
6650: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b  o invoke the LIK
6660: 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  E.          ** f
6670: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f  unction, then no
6680: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c   OP_Variable wil
6690: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
66a0: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20  e program..     
66b0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75       ** This cau
66c0: 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72  ses problems for
66d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
66e0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
66f0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ().          ** 
6700: 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75  API. To workarou
6710: 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64  nd them, add a d
6720: 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65  ummy OP_Variable
6730: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20   here..         
6740: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69   */ .          i
6750: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6760: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6780: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
6790: 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  et(pParse, pRigh
67a0: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t, r1);.        
67b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67c0: 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33  ngeP3(v, sqlite3
67d0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
67e0: 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  v)-1, 0);.      
67f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
6800: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6810: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
6820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6830: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b  se{.      z = 0;
6840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6850: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
6860: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Val);.  return (
6870: 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  z!=0);.}.#endif 
6880: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
6890: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
68a0: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
68b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
68c0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
68d0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
68e0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
68f0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
6900: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
6910: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
6920: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
6930: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
6940: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
6950: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
6960: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
6970: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
6980: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
6990: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
69a0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
69b0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
69c0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
69d0: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
69e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
69f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6a00: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6a10: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6a20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6a30: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
6a40: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6a50: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
6a60: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
6a70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6a80: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6a90: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
6aa0: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
6ab0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6ac0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
6ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6ae0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
6af0: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
6b00: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
6b10: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
6b20: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
6b30: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
6b40: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
6b50: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
6b60: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
6b70: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
6b80: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
6b90: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
6ba0: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
6bb0: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
6bc0: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
6bd0: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
6be0: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
6bf0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
6c00: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
6c10: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
6c20: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6c30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
6c40: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
6c50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6c60: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
6c70: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65  .** Analyze a te
6c80: 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  rm that consists
6c90: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
6ca0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  OR-connected.** 
6cb0: 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e  subterms.  So in
6cc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  :.**.**     ... 
6cd0: 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44  WHERE  (a=5) AND
6ce0: 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20   (b=7 OR c=9 OR 
6cf0: 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29  d=13) AND (d=13)
6d00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
6d20: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6d30: 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ^.**.** This rou
6d40: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65  tine analyzes te
6d50: 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20  rms such as the 
6d60: 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74  middle term in t
6d70: 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65  he above example
6d80: 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65  ..** A WhereOrTe
6d90: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d  rm object is com
6da0: 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68  puted and attach
6db0: 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75  ed to the term u
6dc0: 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  nder.** analysis
6dd0: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
6de0: 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74  the outcome of t
6df0: 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65  he analysis.  He
6e00: 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  nce:.**.**     W
6e10: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
6e20: 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e     |=  TERM_ORIN
6e30: 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  FO.**     WhereT
6e40: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d  erm.u.pOrInfo  =
6e50: 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20    a dynamically 
6e60: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f  allocated WhereO
6e70: 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a  rTerm object.**.
6e80: 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  ** The term bein
6e90: 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20  g analyzed must 
6ea0: 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  have two or more
6eb0: 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64   of OR-connected
6ec0: 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20   subterms..** A 
6ed0: 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d  single subterm m
6ee0: 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66  ight be a set of
6ef0: 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73   AND-connected s
6f00: 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ub-subterms..** 
6f10: 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d  Examples of term
6f20: 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73  s under analysis
6f30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20  :.**.**     (A) 
6f40: 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52      t1.x=t2.y OR
6f50: 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31   t1.x=t2.z OR t1
6f60: 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33  .y=15 OR t1.z=t3
6f70: 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20  .a+5.**     (B) 
6f80: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65      x=expr1 OR e
6f90: 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72  xpr2=x OR x=expr
6fa0: 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20  3.**     (C)    
6fb0: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74   t1.x=t2.y OR (t
6fc0: 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e  1.x=t2.z AND t1.
6fd0: 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29  y=15).**     (D)
6fe0: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
6ff0: 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41  (y>11 AND y<22 A
7000: 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c  ND z LIKE '*hell
7010: 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20  o*').**     (E) 
7020: 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71      (p.a=1 AND q
7030: 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20  .b=2 AND r.c=3) 
7040: 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e  OR (p.x=4 AND q.
7050: 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a  y=5 AND r.z=6).*
7060: 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a  *.** CASE 1:.**.
7070: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7080: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
7090: 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20  rm T.C=expr for 
70a0: 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75  some single colu
70b0: 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e  mn of C.** a sin
70c0: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
70d0: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
70e0: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
70f0: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
7100: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
7110: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
7120: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
7130: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
7140: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
7150: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
7160: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
7170: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
7180: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
7190: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
71a0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
71b0: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
71c0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
71d0: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
71e0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
71f0: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
7200: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
7210: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
7220: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
7230: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
7240: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
7250: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
7260: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
7270: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7280: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
7290: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
72a0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
72b0: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
72c0: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
72d0: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
72e0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
72f0: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
7300: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
7310: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
7320: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
7330: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
7340: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
7350: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
7360: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
7370: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
7380: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
7390: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
73a0: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
73b0: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
73c0: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
73d0: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
73e0: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
73f0: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
7400: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7410: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
7420: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
7430: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
7440: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
7450: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
7460: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
7470: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
7480: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
7490: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
74a0: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
74b0: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
74c0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
74d0: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
74e0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
74f0: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
7500: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
7510: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
7520: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
7530: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
7540: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
7550: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
7560: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
7570: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
7580: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
7590: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
75a0: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
75b0: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
75c0: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
75d0: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
75e0: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
75f0: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
7600: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
7610: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
7620: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
7630: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
7640: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
7650: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
7660: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
7670: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
7680: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
7690: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
76a0: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
76b0: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
76c0: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
76d0: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
76e0: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
76f0: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
7700: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
7710: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
7720: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
7730: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
7740: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
7750: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
7760: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
7770: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
7780: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
7790: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
77a0: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
77b0: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
77c0: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
77d0: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
77e0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
77f0: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
7800: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
7810: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
7820: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
7830: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
7840: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
7850: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
7860: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
7870: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
7880: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
7890: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
78a0: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
78b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
78c0: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
78d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
78f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7900: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7910: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
7920: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
7930: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
7940: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
7950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7960: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
7970: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7980: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
7990: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
79a0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
79b0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
79c0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
79d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
79e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7a00: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7a10: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7a20: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7a30: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7a40: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7a50: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7a60: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7a80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7a90: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
7aa0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7ab0: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
7ac0: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
7ad0: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
7ae0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
7b10: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
7b20: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
7b30: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
7b40: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
7b50: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
7b60: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
7b70: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
7b80: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
7b90: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7ba0: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7bb0: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7bc0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7bd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7be0: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
7bf0: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
7c00: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
7c10: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
7c20: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
7c30: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
7c40: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7c50: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
7c60: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
7c70: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
7c80: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
7c90: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7ca0: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7cb0: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7cc0: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7cd0: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
7ce0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
7cf0: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
7d00: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
7d10: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
7d20: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
7d30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
7d40: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
7d50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
7d60: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7d70: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
7d80: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
7d90: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
7da0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
7db0: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
7dc0: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
7dd0: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
7de0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7df0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
7e00: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
7e10: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
7e20: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
7e30: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
7e40: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
7e50: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
7e60: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
7e70: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
7e80: 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
7e90: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
7ea0: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
7eb0: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
7ec0: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
7ed0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7ee0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7ef0: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
7f00: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
7f10: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
7f20: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
7f30: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7f40: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
7f50: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
7f60: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
7f70: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
7f80: 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66  pWC->vmask);.  f
7f90: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
7fa0: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
7fb0: 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69  Wc->a; i>=0 && i
7fc0: 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70  ndexable; i--, p
7fd0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69  OrTerm++){.    i
7fe0: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
7ff0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47  erator & WO_SING
8000: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)==0 ){.      
8010: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41  WhereAndInfo *pA
8020: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  ndInfo;.      as
8030: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
8040: 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20  Operator==0 );. 
8050: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
8060: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8070: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
8080: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
8090: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
80a0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
80b0: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
80c0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
80d0: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
80e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
80f0: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
8100: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
8110: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
8120: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
8130: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
8140: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
8150: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
8160: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
8170: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
8180: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
8190: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
81a0: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
81b0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
81c0: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
81d0: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
81e0: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
81f0: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
8200: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
8210: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
8220: 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20  skSet);.        
8230: 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57  whereSplit(pAndW
8240: 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  C, pOrTerm->pExp
8250: 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  r, TK_AND);.    
8260: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41      exprAnalyzeA
8270: 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29  ll(pSrc, pAndWC)
8280: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
8290: 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
82a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
82b0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
82c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
82d0: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64     for(j=0, pAnd
82e0: 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20  Term=pAndWC->a; 
82f0: 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b  j<pAndWC->nTerm;
8300: 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b   j++, pAndTerm++
8310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
8320: 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d  ssert( pAndTerm-
8330: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
8340: 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65        if( allowe
8350: 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45  dOp(pAndTerm->pE
8360: 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20  xpr->op) ){.    
8370: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
8380: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
8390: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
83a0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
83b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
83c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
83d0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
83e0: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
83f0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
8400: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8410: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
8420: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
8430: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
8440: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
8450: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
8460: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
8470: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
8480: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
8490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
84a0: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
84b0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
84c0: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
84d0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
84e0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
84f0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8500: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
8510: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
8520: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
8530: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
8540: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
8550: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
8560: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
8570: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
8580: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
8590: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
85a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
85b0: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  WO_EQ ){.       
85c0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
85d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
85e0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
85f0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
8600: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
8610: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
8620: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
8630: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
8640: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
8650: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
8660: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
8670: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
8680: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
8690: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
86a0: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
86b0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
86c0: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
86d0: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
86e0: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
86f0: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
8700: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
8710: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
8720: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
8730: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
8740: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
8750: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
8760: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
8770: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
8780: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
8790: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
87a0: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
87b0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
87c0: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
87d0: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
87e0: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
87f0: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
8800: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
8810: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
8820: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
8830: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
8840: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
8850: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
8860: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
8870: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
8880: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
8890: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
88a0: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
88b0: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
88c0: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
88d0: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
88e0: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
88f0: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
8900: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
8910: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
8920: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
8930: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
8940: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
8950: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
8960: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
8970: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
8980: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
8990: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
89a0: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
89b0: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
89c0: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
89d0: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
89e0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
89f0: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
8a00: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8a10: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8a20: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8a30: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
8a40: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
8a50: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
8a60: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
8a70: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
8a80: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
8a90: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8aa0: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
8ab0: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
8ac0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
8ad0: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
8ae0: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
8af0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
8b00: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
8b10: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
8b20: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
8b30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8b40: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
8b50: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
8b60: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
8b70: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8b80: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
8b90: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
8ba0: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
8bb0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
8bc0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
8bd0: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
8be0: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
8bf0: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
8c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8c10: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
8c20: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
8c30: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
8c40: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
8c50: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
8c60: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
8c70: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
8c80: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
8c90: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
8ca0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
8cb0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
8cc0: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
8cd0: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
8ce0: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
8cf0: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
8d00: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8d10: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
8d20: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
8d30: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
8d40: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
8d50: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
8d60: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
8d70: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
8d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
8d90: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
8da0: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
8db0: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
8dc0: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
8dd0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
8de0: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
8df0: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
8e00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8e10: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8e20: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
8e30: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
8e40: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
8e50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
8e60: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8e70: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b  rsor==iCursor ){
8e80: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
8e90: 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20  is is the 2-bit 
8ea0: 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20  case and we are 
8eb0: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
8ec0: 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  eration and.    
8ed0: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
8ee0: 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68   term is from th
8ef0: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
8f00: 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73  n.  So skip this
8f10: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   term. */.      
8f20: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
8f30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
8f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8f50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  }.        if( (c
8f60: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
8f70: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
8f80: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
8f90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8fa0: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
8fb0: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
8fc0: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
8fd0: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
8fe0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
8ff0: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
9000: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
9010: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
9020: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
9030: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
9040: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
9050: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
9060: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
9070: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
9080: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
9090: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
90a0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
90b0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
90c0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
90d0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
90e0: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
90f0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
9100: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
9110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9120: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9130: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
9140: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
9150: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
9160: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
9170: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
9180: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
9190: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
91a0: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
91b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
91c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
91e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
91f0: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
9200: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
9210: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
9220: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
9230: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
9240: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
9250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9260: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
9270: 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f   assert( (chngTo
9280: 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29  IN&(chngToIN-1))
9290: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
92a0: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
92b0: 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  =getMask(pMaskSe
92c0: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
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 74 65 73 74      }.      test
92f0: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
9300: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
9310: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
9320: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
9330: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
9340: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
9350: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
9360: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
9370: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
9380: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
9390: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
93a0: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
93b0: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
93c0: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
93d0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
93e0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
93f0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
9400: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
9410: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
9420: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
9430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
9440: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9450: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
9460: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9470: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9480: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
9490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
94a0: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
94b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
94c0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
94d0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
94e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
94f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
9500: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
9510: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
9520: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
9530: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
9540: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
9550: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
9560: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
9570: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
9580: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
9590: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
95a0: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
95b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
95c0: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
95d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
95e0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
95f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9600: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
9610: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9620: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9630: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
9640: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
9650: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
9660: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
9670: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
9680: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9690: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
96a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
96b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
96c0: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
96d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
96e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
96f0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
9700: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
9710: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
9720: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
9730: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
9740: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
9750: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
9760: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
9770: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
9780: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
9790: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
97a0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a  perator..    **.
97b0: 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32      ** EV: R-002
97c0: 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a  11-15100.    */.
97d0: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
97e0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
97f0: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
9800: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
9810: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
9820: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9830: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9840: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
9850: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
9860: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9870: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
9880: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
9890: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
98a0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
98b0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
98c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
98d0: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
98e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
98f0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
9900: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
9910: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
9920: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9930: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
9940: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
9950: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
9960: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
9970: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
9980: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
9990: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
99a0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
99b0: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
99c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
99d0: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
99e0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
99f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
9a00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9a10: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
9a20: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29  Expr->pRight, 0)
9a30: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
9a40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9a50: 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61  tAppend(pWC->pPa
9a60: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
9a70: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
9a80: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
9a90: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
9aa0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9ab0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
9ac0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9ad0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
9ae0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
9af0: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
9b00: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
9b10: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
9b20: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
9b30: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
9b40: 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73  w;.        trans
9b50: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
9b60: 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
9b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
9b80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9b90: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
9ba0: 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  t) );.        pN
9bb0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
9bc0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
9bd0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
9be0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
9bf0: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
9c00: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
9c10: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9c20: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
9c30: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
9c40: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
9c50: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
9c60: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
9c70: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
9c80: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
9c90: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
9ca0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
9cb0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
9cc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9ce0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
9cf0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9d00: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9d10: 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65  or = 0;  /* case
9d20: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
9d30: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
9d40: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9d50: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
9d60: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
9d70: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
9d80: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  */.../*.** The i
9d90: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
9da0: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
9db0: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
9dc0: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
9dd0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
9de0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
9df0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
9e00: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
9e10: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
9e20: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
9e30: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
9e40: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
9e50: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
9e60: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
9e70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9e80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
9e90: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
9ea0: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
9eb0: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
9ec0: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
9ed0: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
9ee0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9ef0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9f00: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9f10: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
9f20: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
9f30: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
9f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
9f50: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
9f60: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
9f70: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
9f80: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
9f90: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
9fa0: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
9fb0: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
9fc0: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
9fd0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
9fe0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
9ff0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
a000: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
a010: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
a020: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
a030: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
a040: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
a050: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
a060: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
a070: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
a080: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
a090: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
a0a0: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
a0b0: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
a0c0: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
a0d0: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
a0e0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
a0f0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
a100: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
a110: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a120: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
a130: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
a140: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
a150: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
a160: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
a170: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
a180: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a190: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
a1a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a1b0: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
a1c0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a1d0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a1e0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
a1f0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
a200: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a210: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
a220: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20   *pMaskSet;     
a230: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74       /* Set of t
a240: 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73  able index masks
a250: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
a260: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
a270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
a280: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
a290: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
a2a0: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a2c0: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
a2d0: 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  f the pExpr->pLe
a2e0: 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ft */.  Bitmask 
a2f0: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
a300: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
a310: 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78  equesites of pEx
a320: 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  pr */.  Bitmask 
a330: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20  extraRight = 0; 
a340: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
a350: 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  a dependencies o
a360: 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20  n LEFT JOIN */. 
a370: 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30   Expr *pStr1 = 0
a380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a390: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
a3a0: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
a3b0: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  /.  int isComple
a3c0: 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
a3d0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
a3e0: 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69  IKE/GLOB ends wi
a3f0: 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  th wildcard */. 
a400: 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b   int noCase = 0;
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64    /* LIKE/GLOB d
a430: 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73  istinguishes cas
a440: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  e */.  int op;  
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c          /* Top-l
a470: 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20  evel operator.  
a480: 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50  pExpr->op */.  P
a490: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
a4a0: 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  WC->pParse;     
a4b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a4c0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
a4d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a4e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
a4f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a500: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
a510: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a520: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a530: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a540: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73  idxTerm];.  pMas
a550: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
a560: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
a570: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
a580: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
a590: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
a5a0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
a5b0: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
a5c0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
a5d0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
a5e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
a5f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
a600: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a610: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
a620: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a630: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
a640: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
a650: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a660: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  et, pExpr->x.pSe
a670: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
a680: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
a690: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
a6a0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
a6b0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a6c0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
a6d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a6e0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
a6f0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a700: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
a710: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
a720: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a730: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a740: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
a750: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
a760: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
a770: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a780: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
a790: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a7a0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a7b0: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
a7c0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
a7d0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
a7e0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
a7f0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
a800: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
a810: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
a820: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
a830: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
a840: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
a870: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
a880: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
a890: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
a8a0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a8b0: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
a8c0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
a8d0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
a8e0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
a8f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
a900: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
a910: 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  p(op) && (pTerm-
a920: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
a930: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
a940: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
a950: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
a960: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
a970: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
a980: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
a990: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
a9a0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
a9b0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
a9c0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
a9d0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
a9e0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
a9f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
aa00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
aa10: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
aa20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
aa30: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
aa40: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
aa50: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
aa60: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
aa70: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
aa80: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
aa90: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
aaa0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
aab0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
aac0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
aad0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
aae0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
aaf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ab00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ab10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ab20: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
ab30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
ab40: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
ab50: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
ab60: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
ab70: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ab80: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ab90: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
aba0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
abb0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
abc0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
abd0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
abe0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
abf0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
ac00: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
ac10: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
ac20: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ac30: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
ac40: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
ac50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ac60: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
ac70: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
ac80: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
ac90: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
aca0: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
acb0: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
acc0: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
acd0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
ace0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
acf0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
ad00: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
ad10: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
ad20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ad30: 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20  ( (prereqLeft | 
ad40: 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70  extraRight) != p
ad50: 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20  rereqLeft );.   
ad60: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52     pNew->prereqR
ad70: 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66  ight = prereqLef
ad80: 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a  t | extraRight;.
ad90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
ada0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
adb0: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
adc0: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
add0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
ade0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
adf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae00: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
ae10: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
ae20: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
ae30: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
ae40: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
ae50: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
ae60: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
ae70: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
ae80: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
ae90: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
aea0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
aeb0: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
aec0: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
aed0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
aee0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
aef0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
af00: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
af10: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
af20: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
af30: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
af40: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
af50: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
af60: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
af70: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
af80: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
af90: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
afa0: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
afb0: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
afc0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
afd0: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
afe0: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
aff0: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
b000: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
b010: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
b020: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
b030: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
b040: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
b050: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
b060: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
b070: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b080: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
b090: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
b0a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b0b0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b0c0: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
b0d0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b0e0: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
b0f0: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
b100: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
b110: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b120: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
b130: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
b140: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
b150: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b160: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
b170: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
b180: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b190: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69  pr(pParse, ops[i
b1a0: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b1d0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
b1e0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
b210: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
b220: 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b  ].pExpr, 0), 0);
b230: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
b240: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b250: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
b260: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
b270: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
b280: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b290: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
b2a0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
b2b0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
b2c0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
b2d0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b2e0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b2f0: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
b300: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
b310: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
b320: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
b330: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
b340: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
b350: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
b360: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b370: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
b380: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
b390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b3a0: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
b3b0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
b3c0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
b3d0: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
b3e0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
b3f0: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
b400: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
b410: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
b420: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
b430: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
b440: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
b450: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
b460: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
b470: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
b480: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b490: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b4a0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b4b0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
b4c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b4d0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
b4e0: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
b4f0: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
b500: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
b510: 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
b520: 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
b530: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
b540: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
b550: 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
b560: 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e   'abc%'" is chan
b570: 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
b580: 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
b590: 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27          x>='abc'
b5a0: 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
b5b0: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20   x LIKE 'abc%'. 
b5c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
b5d0: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
b5e0: 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
b5f0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
b600: 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
b610: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
b620: 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a  ition "abd"..  *
b630: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
b640: 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69  =TK_AND .   && i
b650: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
b660: 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72  se, pExpr, &pStr
b670: 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20  1, &isComplete, 
b680: 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20  &noCase).  ){.  
b690: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
b6a0: 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c       /* LHS of L
b6b0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
b6c0: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
b6d0: 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43  Str2;       /* C
b6e0: 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52  opy of pStr1 - R
b6f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b700: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b710: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b  Expr *pNewExpr1;
b720: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b730: 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
b740: 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69  xNew1;.    int i
b750: 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c  dxNew2;.    Coll
b760: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
b770: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
b780: 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a  ence to use */..
b790: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b7a0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b7b0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b7c0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b7d0: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b7e0: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b7f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b800: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b810: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b820: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b830: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b840: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b850: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b860: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b870: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b880: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b890: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b8a0: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b8b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b8c0: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b8d0: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b8e0: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b8f0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b900: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b910: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
b920: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
b930: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
b940: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
b950: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
b960: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
b970: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
b980: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
b990: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
b9a0: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
b9b0: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
b9c0: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
b9d0: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
b9e0: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
b9f0: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
ba00: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
ba10: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
ba20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
ba30: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
ba40: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20  plete = 0;   /* 
ba50: 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30  EV: R-64339-0820
ba60: 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63  7 */...        c
ba70: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
ba80: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
ba90: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
baa0: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
bab0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
bac0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
bad0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61  QLITE_UTF8, noCa
bae0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
baf0: 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20  "BINARY",0);.   
bb00: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
bb10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bb20: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bb40: 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c  qlite3ExprSetCol
bb50: 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  l(sqlite3ExprDup
bb60: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43  (db,pLeft,0), pC
bb70: 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  oll),.          
bb80: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
bb90: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
bba0: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
bbb0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bbc0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
bbd0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
bbe0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bbf0: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
bc00: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bc10: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
bc20: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
bc30: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bc40: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
bc70: 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78  etColl(sqlite3Ex
bc80: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30  prDup(db,pLeft,0
bc90: 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20  ), pColl),.     
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
bcc0: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
bcd0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
bce0: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
bcf0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
bd00: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
bd10: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
bd20: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
bd30: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
bd40: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
bd50: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
bd60: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
bd70: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
bd80: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
bd90: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
bda0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
bdb0: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
bdc0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
bdd0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
bde0: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
bdf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
be00: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
be10: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
be20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
be30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
be40: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
be50: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
be60: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
be70: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
be80: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
be90: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
bea0: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
beb0: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
bec0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
bed0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
bee0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
bef0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
bf00: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
bf10: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
bf20: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
bf30: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
bf40: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
bf50: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
bf60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
bf70: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
bf80: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
bf90: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
bfa0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
bfb0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
bfc0: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
bfd0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
bfe0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
bff0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
c000: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
c010: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
c020: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
c030: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
c040: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
c050: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
c060: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
c070: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
c080: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
c090: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
c0a0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
c0b0: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
c0c0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
c0d0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
c0e0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
c0f0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
c100: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c110: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
c140: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
c150: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
c160: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c170: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c180: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
c190: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c1a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
c1b0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
c1c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
c1d0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c1e0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c1f0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c200: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
c210: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c220: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c230: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c240: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c250: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c260: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c270: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c280: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
c290: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
c2a0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
c2b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
c2c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
c2d0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
c2e0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
c2f0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
c300: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
c310: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
c320: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
c330: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
c340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c350: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c360: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
c370: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
c380: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
c390: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
c3a0: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
c3b0: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
c3c0: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
c3d0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
c3e0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
c3f0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
c400: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
c410: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
c420: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f  rn TRUE if any o
c430: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c440: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46  s in pList->a[iF
c450: 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e  irst...] contain
c460: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
c470: 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68  to any table oth
c480: 65 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73  er than the iBas
c490: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
c4a0: 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65  ic int reference
c4b0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20  sOtherTables(.  
c4c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
c4e0: 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  rch expressions 
c4f0: 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20  in ths list */. 
c500: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
c510: 4d 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61  MaskSet,   /* Ma
c520: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
c530: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
c540: 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
c550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
c560: 65 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68  e searching with
c570: 20 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65   the iFirst-th e
c580: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
c590: 6e 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20  nt iBase        
c5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f           /* Igno
c5b0: 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
c5c0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
c5d0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f  {.  Bitmask allo
c5e0: 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70  wed = ~getMask(p
c5f0: 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b  MaskSet, iBase);
c600: 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74  .  while( iFirst
c610: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  <pList->nExpr ){
c620: 0a 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61  .    if( (exprTa
c630: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
c640: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72  t, pList->a[iFir
c650: 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c  st++].pExpr)&all
c660: 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  owed)!=0 ){.    
c670: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c680: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
c690: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
c6a0: 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73   routine decides
c6b0: 20 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20   if pIdx can be 
c6c0: 75 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  used to satisfy 
c6d0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
c6e0: 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63  clause.  If it c
c6f0: 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31  an, it returns 1
c700: 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f  .  If pIdx canno
c710: 74 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  t satisfy the.**
c720: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c730: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
c740: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
c750: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
c760: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
c770: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
c780: 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73  tement.  pTab is
c790: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
c7a0: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
c7b0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
c7c0: 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73  at same SELECT s
c7d0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20  tatement and.** 
c7e0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
c7f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
c800: 20 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69   "base".  pIdx i
c810: 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54  s an index on pT
c820: 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c  ab..**.** nEqCol
c830: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c840: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64  f columns of pId
c850: 78 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  x that are used 
c860: 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  as equality.** c
c870: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79  onstraints.  Any
c880: 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e   of these column
c890: 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67  s may be missing
c8a0: 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
c8b0: 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64  BY.** clause and
c8c0: 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73   the match can s
c8d0: 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73  till be a succes
c8e0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
c8f0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
c900: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
c910: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
c920: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
c930: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
c940: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
c950: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
c960: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
c970: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
c980: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
c990: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
c9a0: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
c9b0: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
c9c0: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
c9d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c9e0: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
c9f0: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
ca00: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
ca10: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
ca20: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
ca30: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
ca40: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
ca50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
ca60: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ca70: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
ca80: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a  et *pMaskSet, /*
ca90: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
caa0: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
cab0: 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f  rs to bitmaps */
cac0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
cad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
cae0: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
caf0: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
cb00: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
cb10: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
cb20: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
cb30: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
cb40: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
cb50: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
cb60: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
cb70: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
cb80: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
cb90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
cba0: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
cbb0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
cbc0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbe0: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
cbf0: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
cc00: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
cc30: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73  nters */.  int s
cc40: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20  ortOrder = 0;   
cc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f             /* XO
cc60: 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f  R of index and O
cc70: 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72  RDER BY sort dir
cc80: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
cc90: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ccb0: 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
ccc0: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  Y terms */.  str
ccd0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cce0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
ccf0: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
cd00: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
cd10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cd20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
cd30: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
cd40: 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d  !=0 );.  nTerm =
cd50: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
cd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ;.  assert( nTer
cd70: 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67  m>0 );..  /* Arg
cd80: 75 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20  ument pIdx must 
cd90: 65 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20  either point to 
cda0: 61 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69  a 'real' named i
cdb0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20  ndex structure, 
cdc0: 0a 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65  .  ** or an inde
cdd0: 78 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f  x structure allo
cde0: 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61  cated on the sta
cdf0: 63 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49  ck by bestBtreeI
ce00: 6e 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ndex() to.  ** r
ce10: 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
ce20: 69 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  id index that is
ce30: 20 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74   part of every t
ce40: 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  able.  */.  asse
ce50: 72 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  rt( pIdx->zName 
ce60: 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  || (pIdx->nColum
ce70: 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69  n==1 && pIdx->ai
ce80: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29  Column[0]==-1) )
ce90: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
cea0: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
ceb0: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
cec0: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
ced0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
cee0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
cef0: 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70  t indices have p
cf00: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67  Idx->nColumn reg
cf10: 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  ular columns plu
cf20: 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74  s.  ** one addit
cf30: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e  ional column con
cf40: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69  taining the rowi
cf50: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f  d.  The rowid co
cf60: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  lumn.  ** of the
cf70: 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61   index is also a
cf80: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
cf90: 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45  against the ORDE
cfa0: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
cfb0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ..  */.  for(i=j
cfc0: 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
cfd0: 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26  By->a; j<nTerm &
cfe0: 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i<=pIdx->nColu
cff0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
d000: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
d010: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
d020: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
d030: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
d040: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
d050: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
d060: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
d070: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74  pExpr */.    int
d080: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20   termSortOrder; 
d090: 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f  /* Sort order fo
d0a0: 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
d0b0: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20     int iColumn; 
d0c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
d0d0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
d0e0: 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72  index.  -1 for r
d0f0: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
d100: 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f  iSortOrder;    /
d110: 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20  * 1 for DESC, 0 
d120: 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69  for ASC on the i
d130: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
d140: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
d150: 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65   *zColl; /* Name
d160: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
d170: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69  g sequence for i
d180: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
d190: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
d1a0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
d1b0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
d1c0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
d1d0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
d1e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
d1f0: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
d200: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
d210: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
d220: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
d230: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
d240: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
d250: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
d260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d270: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
d280: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
d290: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
d2a0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
d2b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
d2c0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
d2d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64     }.    if( pId
d2e0: 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49  x->zName && i<pI
d2f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
d300: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
d310: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d320: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
d330: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c  umn==pIdx->pTabl
d340: 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  e->iPKey ){.    
d350: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
d360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d370: 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64  iSortOrder = pId
d380: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
d390: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
d3a0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
d3b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d3c0: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a    iColumn = -1;.
d3d0: 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72        iSortOrder
d3e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c   = 0;.      zCol
d3f0: 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l = pColl->zName
d400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d410: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
d420: 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74  iColumn || sqlit
d430: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
d440: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
d450: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
d460: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
d470: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
d480: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
d490: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
d4a0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
d4b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
d4c0: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
d4d0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
d4e0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
d4f0: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
d500: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
d510: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
d520: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
d530: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
d540: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
d550: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d560: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d570: 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49 64  }else if( i==pId
d580: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
d590: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63        /* Index c
d5a0: 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20 72  olumn i is the r
d5b0: 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72  owid.  All other
d5c0: 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f   terms match. */
d5d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d5e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d5f0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
d600: 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73  dex column fails
d610: 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73   to match and is
d620: 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
d630: 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a   by ==.        *
d640: 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78  * then the index
d650: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
d660: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e  the ORDER BY con
d670: 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20  straint..       
d680: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
d690: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
d6a0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d6b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
d6c0: 21 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d  !=0 || iColumn==
d6d0: 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
d6e0: 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ( pTerm->sortOrd
d6f0: 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e  er==0 || pTerm->
d700: 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  sortOrder==1 );.
d710: 20 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72      assert( iSor
d720: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f  tOrder==0 || iSo
d730: 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20  rtOrder==1 );.  
d740: 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20    termSortOrder 
d750: 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70  = iSortOrder ^ p
d760: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Term->sortOrder;
d770: 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f  .    if( i>nEqCo
d780: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74  l ){.      if( t
d790: 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f  ermSortOrder!=so
d7a0: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
d7b0: 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61     /* Indices ca
d7c0: 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69  n only be used i
d7d0: 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
d7e0: 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20  erms past the.  
d7f0: 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74        ** equalit
d800: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
d810: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53  e all either DES
d820: 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20  C or ASC. */.   
d830: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d850: 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65  {.      sortOrde
d860: 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  r = termSortOrde
d870: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  r;.    }.    j++
d880: 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20  ;.    pTerm++;. 
d890: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30     if( iColumn<0
d8a0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
d8b0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
d8c0: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
d8d0: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20  , base) ){.     
d8e0: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
d8f0: 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  ed column is the
d900: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64   primary key and
d910: 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63   everything matc
d920: 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20  hes.      ** so 
d930: 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20  far and none of 
d940: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
d950: 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ms to the right 
d960: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a  reference other.
d970: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
d980: 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65  in the join, the
d990: 6e 20 77 65 20 61 72 65 20 61 73 73 75 72 65 64  n we are assured
d9a0: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
d9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20  can be used .   
d9c0: 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65     ** to sort be
d9d0: 63 61 75 73 65 20 74 68 65 20 70 72 69 6d 61 72  cause the primar
d9e0: 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20  y key is unique 
d9f0: 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74  and so none of t
da00: 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  he other.      *
da10: 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d  * columns will m
da20: 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e  ake any differen
da30: 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ce.      */.    
da40: 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20    j = nTerm;.   
da50: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76   }.  }..  *pbRev
da60: 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b   = sortOrder!=0;
da70: 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20  .  if( j>=nTerm 
da80: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65  ){.    /* All te
da90: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
daa0: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63   BY clause are c
dab0: 6f 76 65 72 65 64 20 62 79 20 74 68 69 73 20 69  overed by this i
dac0: 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74  ndex so.    ** t
dad0: 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65  his index can be
dae0: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
daf0: 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  g. */.    return
db00: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49   1;.  }.  if( pI
db10: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
db20: 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d  None && i==pIdx-
db30: 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26  >nColumn.      &
db40: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
db50: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
db60: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20  y, pMaskSet, j, 
db70: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20  base) ){.    /* 
db80: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69  All terms of thi
db90: 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f  s index match so
dba0: 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  me prefix of the
dbb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
dbc0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
dbd0: 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20  index is UNIQUE 
dbe0: 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20  and no terms on 
dbf0: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
dc00: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
dc10: 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65  clause reference
dc20: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
dc30: 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69   a join.  If thi
dc40: 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68  s is all true th
dc50: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  en.    ** the or
dc60: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73  der by clause is
dc70: 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f   superfluous. */
dc80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
dc90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
dca0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
dcb0: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
dcc0: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
dcd0: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
dce0: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
dcf0: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
dd00: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
dd10: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
dd20: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
dd30: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
dd40: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
dd50: 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ions with O(logN
dd60: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
dd70: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
dd80: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
dd90: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
dda0: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
ddb0: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
ddc0: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
ddd0: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
dde0: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
ddf0: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
de00: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
de10: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
de20: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
de30: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
de40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
de50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
de60: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
de70: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
de80: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
de90: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
dea0: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
deb0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
dec0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
ded0: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
dee0: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
def0: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
df00: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
df10: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
df20: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
df30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
df40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
df50: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
df60: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
df70: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
df80: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
df90: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
dfa0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
dfb0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
dfc0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
dfd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
dfe0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
dff0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
e000: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
e010: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
e020: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
e030: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
e040: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
e050: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
e060: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e070: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
e080: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
e090: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
e0a0: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
e0b0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e0c0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
e0d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
e0e0: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
e0f0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e100: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
e110: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
e120: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
e130: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
e140: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
e150: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
e160: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
e170: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
e180: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
e190: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
e1a0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
e1b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
e1c0: 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  !sqlite3WhereTra
e1d0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
e1e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
e1f0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
e200: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
e210: 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b  Printf("  usage[
e220: 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20  %d]: argvIdx=%d 
e230: 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  omit=%d\n",.    
e240: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
e250: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
e260: 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20  [i].argvIndex,. 
e270: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e280: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
e290: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
e2a0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
e2b0: 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d  idxNum=%d\n", p-
e2c0: 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69  >idxNum);.  sqli
e2d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
e2e0: 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20    idxStr=%s\n", 
e2f0: 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  p->idxStr);.  sq
e300: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e310: 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75  ("  orderByConsu
e320: 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72  med=%d\n", p->or
e330: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a  derByConsumed);.
e340: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e350: 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65  intf("  estimate
e360: 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e  dCost=%g\n", p->
e370: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a  estimatedCost);.
e380: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
e390: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
e3a0: 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (A).#define TRAC
e3b0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29  E_IDX_OUTPUTS(A)
e3c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
e3d0: 52 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  Required because
e3e0: 20 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20   bestIndex() is 
e3f0: 63 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72  called by bestOr
e400: 43 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a  ClauseIndex() .*
e410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
e420: 73 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61 72  stIndex(.    Par
e430: 73 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  se*, WhereClause
e440: 2a 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  *, struct SrcLis
e450: 74 5f 69 74 65 6d 2a 2c 0a 20 20 20 20 42 69 74  t_item*,.    Bit
e460: 6d 61 73 6b 2c 20 42 69 74 6d 61 73 6b 2c 20 45  mask, Bitmask, E
e470: 78 70 72 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  xprList*, WhereC
e480: 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ost*);../*.** Th
e490: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
e4a0: 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e 20 73  pts to find an s
e4b0: 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65 67 79  canning strategy
e4c0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
e4d0: 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  d .** to optimiz
e4e0: 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72 65 73  e an 'OR' expres
e4f0: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
e500: 74 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c 61  t of a WHERE cla
e510: 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  use. .**.** The 
e520: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
e530: 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   with FROM claus
e540: 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61 79 20  e term pSrc may 
e550: 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a 20 72  be either a.** r
e560: 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20 74 61  egular B-Tree ta
e570: 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61 6c  ble or a virtual
e580: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
e590: 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43 6c 61  c void bestOrCla
e5a0: 75 73 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  useIndex(.  Pars
e5b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e5c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
e5d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e5e0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
e5f0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
e600: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
e610: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
e620: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
e630: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
e640: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
e650: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
e660: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
e670: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
e680: 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61  of cursors not a
e690: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64  vailable for ind
e6a0: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
e6b0: 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20  sk notValid,    
e6c0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
e6d0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
e6e0: 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20  for any purpose 
e6f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e700: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
e710: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
e720: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
e730: 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
e740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
e750: 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
e760: 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  an */.){.#ifndef
e770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
e780: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 63  OPTIMIZATION.  c
e790: 6f 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d 20  onst int iCur = 
e7a0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20  pSrc->iCursor;  
e7b0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
e7c0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
e7d0: 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20  e accessed */.  
e7e0: 63 6f 6e 73 74 20 42 69 74 6d 61 73 6b 20 6d 61  const Bitmask ma
e7f0: 73 6b 53 72 63 20 3d 20 67 65 74 4d 61 73 6b 28  skSrc = getMask(
e800: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
e810: 43 75 72 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73  Cur);  /* Bitmas
e820: 6b 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20  k for pSrc */.  
e830: 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
e840: 74 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d  t pWCEnd = &pWC-
e850: 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20  >a[pWC->nTerm]; 
e860: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e870: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57   pWC->a[] */.  W
e880: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
e8b0: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
e8c0: 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4e  lause */..  /* N
e8d0: 6f 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69  o OR-clause opti
e8e0: 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  mization allowed
e8f0: 20 69 66 20 74 68 65 20 49 4e 44 45 58 45 44 20   if the INDEXED 
e900: 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
e910: 44 20 63 6c 61 75 73 65 73 0a 20 20 2a 2a 20 61  D clauses.  ** a
e920: 72 65 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28  re used */.  if(
e930: 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
e940: 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49 6e 64 65  d || pSrc->pInde
e950: 78 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x!=0 ){.    retu
e960: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rn;.  }..  /* Se
e970: 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20 63  arch the WHERE c
e980: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 20  lause terms for 
e990: 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74  a usable WO_OR t
e9a0: 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54  erm. */.  for(pT
e9b0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
e9c0: 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
e9d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
e9e0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
e9f0: 5f 4f 52 20 0a 20 20 20 20 20 26 26 20 28 28 70  _OR .     && ((p
ea00: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
ea10: 26 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f  & ~maskSrc) & no
ea20: 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
ea30: 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
ea40: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
ea50: 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
ea60: 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
ea70: 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
ea80: 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
ea90: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
eaa0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
eab0: 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
eac0: 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
ead0: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
eae0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
eaf0: 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
eb00: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
eb10: 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
eb20: 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
eb30: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
eb40: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
eb50: 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
eb60: 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
eb70: 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
eb80: 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
eb90: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
eba0: 20 20 57 68 65 72 65 43 6f 73 74 20 73 54 65 72    WhereCost sTer
ebb0: 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57  mCost;.        W
ebc0: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
ebd0: 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74  Multi-index OR t
ebe0: 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20  esting for term 
ebf0: 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c  %d of %d....\n",
ec00: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4f 72   .          (pOr
ec10: 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29  Term - pOrWC->a)
ec20: 2c 20 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e  , (pTerm - pWC->
ec30: 61 29 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20  a).        ));. 
ec40: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
ec50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
ec60: 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
ec70: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
ec80: 70 41 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72  pAndWC = &pOrTer
ec90: 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
eca0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  c;.          bes
ecb0: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
ecc0: 41 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  AndWC, pSrc, not
ecd0: 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
ece0: 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
ecf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ed00: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
ed10: 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
ed20: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
ed30: 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
ed40: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
ed50: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
ed60: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
ed70: 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
ed80: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
ed90: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
eda0: 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
edb0: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
edc0: 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
edd0: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
ede0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
edf0: 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
ee00: 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72  se, &tempWC, pSr
ee10: 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
ee20: 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d  Valid, 0, &sTerm
ee30: 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
ee40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ee50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ee60: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74    }.        rTot
ee70: 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e  al += sTermCost.
ee80: 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  rCost;.        n
ee90: 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74  Row += sTermCost
eea0: 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  .plan.nRow;.    
eeb0: 20 20 20 20 75 73 65 64 20 7c 3d 20 73 54 65 72      used |= sTer
eec0: 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20  mCost.used;.    
eed0: 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d      if( rTotal>=
eee0: 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20 62  pCost->rCost ) b
eef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ef00: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
ef10: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
ef20: 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65  clause, increase
ef30: 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74   the scan cost t
ef40: 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20  o account .     
ef50: 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74   ** for the cost
ef60: 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f   of the sort. */
ef70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
ef80: 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy!=0 ){.      
ef90: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
efa0: 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
efb0: 61 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39  ases OR cost %.9
efc0: 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20  g to %.9g\n",.  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c    rTotal, rTotal
eff0: 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f  +nRow*estLog(nRo
f000: 77 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54  w)));.        rT
f010: 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  otal += nRow*est
f020: 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20  Log(nRow);.     
f030: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
f040: 74 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e  the cost of scan
f050: 6e 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20  ning using this 
f060: 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69  OR term for opti
f070: 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20  mization is.    
f080: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
f090: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20  he current cost 
f0a0: 73 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c  stored in pCost,
f0b0: 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   replace the con
f0c0: 74 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  tents.      ** o
f0d0: 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20  f pCost. */.    
f0e0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
f0f0: 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. multi-index O
f100: 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77  R cost=%.9g nrow
f110: 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c  =%.9g\n", rTotal
f120: 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  , nRow));.      
f130: 69 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74  if( rTotal<pCost
f140: 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  ->rCost ){.     
f150: 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
f160: 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
f170: 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20    pCost->used = 
f180: 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 43  used;.        pC
f190: 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
f1a0: 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
f1b0: 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
f1c0: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs = flags;.    
f1d0: 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
f1e0: 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b  u.pTerm = pTerm;
f1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f200: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
f210: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
f220: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23  MIZATION */.}..#
f230: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f240: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
f250: 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
f260: 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
f270: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
f280: 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
f290: 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
f2a0: 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
f2b0: 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
f2c0: 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
f2d0: 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
f2e0: 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
f2f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f300: 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
f310: 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
f320: 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
f330: 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
f340: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
f350: 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
f360: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
f370: 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
f380: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
f390: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
f3a0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f3c0: 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
f3d0: 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
f3e0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
f3f0: 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
f400: 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
f410: 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
f420: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
f430: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
f440: 5f 45 51 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  _EQ ) return 0;.
f450: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
f460: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
f470: 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72  eady)!=0 ) retur
f480: 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
f490: 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
f4a0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
f4b0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
f4c0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
f4d0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
f4e0: 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
f4f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
f500: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
f510: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f520: 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
f530: 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  DEX./*.** If the
f540: 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
f550: 70 53 72 63 20 73 70 65 63 69 66 69 65 64 20 69  pSrc specified i
f560: 6e 20 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c  n pCost is a ful
f570: 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l table scan.** 
f580: 61 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20  and indexing is 
f590: 61 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65  allows (if there
f5a0: 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58   is no NOT INDEX
f5b0: 45 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69  ED clause) and i
f5c0: 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  t.** possible to
f5d0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61   construct a tra
f5e0: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61  nsient index tha
f5f0: 74 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20  t would perform 
f600: 62 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61  better.** than a
f610: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
f620: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63   even when the c
f630: 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74  ost of construct
f640: 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
f650: 20 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61   is taken into a
f660: 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74  ccount, then alt
f670: 65 72 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  er the query pla
f680: 6e 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  n to use the.** 
f690: 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e  transient index.
f6a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f6b0: 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
f6c0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
f6d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
f6e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
f6f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
f700: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
f710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f720: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
f730: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
f740: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
f750: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
f760: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
f770: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
f780: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
f790: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
f7a0: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
f7b0: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
f7c0: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
f7d0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
f7e0: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
f7f0: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64  y plan */.){.  d
f800: 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
f810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
f820: 77 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ws in the input 
f830: 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c  table */.  doubl
f840: 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20  e logN;         
f850: 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54         /* log(nT
f860: 61 62 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f  ableRow) */.  do
f870: 75 62 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78  uble costTempIdx
f880: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72  ;         /* per
f890: 2d 71 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74  -query cost of t
f8a0: 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
f8b0: 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
f8c0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
f8d0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
f8e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
f8f0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
f900: 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
f910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
f920: 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
f930: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f950: 20 54 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74   Table tht might
f960: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a   be indexed */..
f970: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
f980: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
f990: 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20  E_AutoIndex)==0 
f9a0: 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  ){.    /* Automa
f9b0: 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65 20  tic indices are 
f9c0: 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d  disabled at run-
f9d0: 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  time */.    retu
f9e0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
f9f0: 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
fa00: 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
fa10: 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a 20  ULLSCAN)!=0 ){. 
fa20: 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79     /* We already
fa30: 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20   have some kind 
fa40: 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20  of index in use 
fa50: 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20  for this query. 
fa60: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
fa70: 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e   }.  if( pSrc->n
fa80: 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  otIndexed ){.   
fa90: 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45   /* The NOT INDE
faa0: 58 45 44 20 63 6c 61 75 73 65 20 61 70 70 65 61  XED clause appea
fab0: 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a  rs in the SQL. *
fac0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
fad0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
fae0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
faf0: 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a  >= (double)1 );.
fb00: 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
fb10: 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52  >pTab;.  nTableR
fb20: 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  ow = pTable->nRo
fb30: 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65  wEst;.  logN = e
fb40: 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  stLog(nTableRow)
fb50: 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49 64 78 20  ;.  costTempIdx 
fb60: 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65  = 2*logN*(nTable
fb70: 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75 65  Row/pParse->nQue
fb80: 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20 69  ryLoop + 1);.  i
fb90: 66 28 20 63 6f 73 74 54 65 6d 70 49 64 78 3e 3d  f( costTempIdx>=
fba0: 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a  pCost->rCost ){.
fbb0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
fbc0: 6f 66 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  of creating the 
fbd0: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
fbe0: 77 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65 72  would be greater
fbf0: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69   than.    ** doi
fc00: 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62 6c  ng the full tabl
fc10: 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65  e scan */.    re
fc20: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
fc30: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20 65  Search for any e
fc40: 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
fc50: 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43  on term */.  pWC
fc60: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
fc70: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72  C->nTerm];.  for
fc80: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
fc90: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
fca0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
fcb0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
fcc0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
fcd0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
fce0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61 75   WHERETRACE(("au
fcf0: 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73  to-index reduces
fd00: 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 32 66 20   cost from %.2f 
fd10: 74 6f 20 25 2e 32 66 5c 6e 22 2c 0a 20 20 20 20  to %.2f\n",.    
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c 20 63 6f  pCost->rCost, co
fd40: 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20 20  stTempIdx));.   
fd50: 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
fd60: 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20  = costTempIdx;. 
fd70: 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
fd80: 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31  .nRow = logN + 1
fd90: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
fda0: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
fdb0: 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
fdc0: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
fdd0: 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
fde0: 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
fdf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
fe00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
fe10: 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
fe20: 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29 20 20 2f  ex(A,B,C,D,E)  /
fe30: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
fe40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fe50: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
fe60: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
fe70: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
fe80: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
fe90: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
fea0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
feb0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
fec0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
fed0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
fee0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
fef0: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
ff00: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
ff10: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
ff20: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
ff30: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
ff40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ff50: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
ff60: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
ff70: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ff80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ff90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ffa0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
ffb0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
ffc0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
ffd0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
ffe0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
fff0: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
10000 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
10010 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
10020 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
10030 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
10040 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
10050 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
10060 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
10070 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10080 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
10090 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
100a0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
100b0 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t nColumn;      
100c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
100d0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
100e0 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
100f0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
10100 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
10110 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
10120 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
10130 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10140 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
10150 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
10160 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
10170 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  ] */.  int nByte
10180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10190 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65     /* Byte of me
101a0 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20  mory needed for 
101b0 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
101c0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
101d0 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
101e0 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74  describing the t
101f0 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
10200 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
10230 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
10240 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
10250 74 20 72 65 67 49 73 49 6e 69 74 3b 20 20 20 20  t regIsInit;    
10260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
10270 69 73 74 65 72 20 73 65 74 20 62 79 20 69 6e 69  ister set by ini
10280 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
10290 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20   int addrInit;  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102b0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
102c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79  nitialization by
102d0 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54  pass jump */.  T
102e0 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
102f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10300 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
10310 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e  dexed */.  KeyIn
10320 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20  fo *pKeyinfo;   
10330 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e         /* Key in
10340 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
10350 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20  e index */   .  
10360 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
10370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10380 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
10390 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
103a0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
103b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
103c0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
103d0 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
103e0 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
10410 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
10450 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
10460 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
10470 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
10480 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
10490 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
104a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
104b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
104c0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
104d0 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
104e0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
104f0 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
10500 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
10510 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
10520 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
10530 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
10540 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
10550 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47  lumns */..  /* G
10560 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10570 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
10580 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
10590 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
105a0 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
105b0 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
105c0 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
105d0 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
105e0 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
105f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
10600 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
10610 72 65 67 49 73 49 6e 69 74 20 3d 20 2b 2b 70 50  regIsInit = ++pP
10620 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61 64  arse->nMem;.  ad
10630 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
10640 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10650 5f 49 66 2c 20 72 65 67 49 73 49 6e 69 74 29 3b  _If, regIsInit);
10660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10670 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10680 65 72 2c 20 31 2c 20 72 65 67 49 73 49 6e 69 74  er, 1, regIsInit
10690 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
106a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
106b0 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
106c0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
106d0 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
106e0 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
106f0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
10700 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
10710 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
10720 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
10730 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
10740 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
10750 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
10760 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
10770 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
10780 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
10790 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
107a0 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
107b0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
107c0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
107d0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
107e0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
107f0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
10800 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
10810 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
10820 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
10830 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10840 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
10850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
10860 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
10870 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
10880 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
10890 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b         nColumn++
108a0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
108b0 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
108c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
108d0 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
108e0 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  0 );.  pLevel->p
108f0 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d  lan.nEq = nColum
10900 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  n;..  /* Count t
10910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
10920 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
10930 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
10940 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
10950 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
10960 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
10970 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
10980 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
10990 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
109a0 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
109b0 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
109c0 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
109d0 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
109e0 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
109f0 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
10a00 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
10a10 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
10a20 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
10a30 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
10a40 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
10a50 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
10a60 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
10a70 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
10a80 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
10a90 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
10aa0 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
10ab0 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
10ac0 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
10ad0 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
10ae0 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
10af0 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   | (((Bitmask)1)
10b00 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d  <<(BMS-1)));.  m
10b10 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c  xBitCol = (pTabl
10b20 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31  e->nCol >= BMS-1
10b30 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62  ) ? BMS-1 : pTab
10b40 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74  le->nCol;.  test
10b50 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
10b60 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
10b70 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
10b80 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
10b90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
10ba0 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
10bb0 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
10bc0 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
10bd0 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a  i) ) nColumn++;.
10be0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
10bf0 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
10c00 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
10c10 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  ) ){.    nColumn
10c20 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
10c30 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
10c40 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77    pLevel->plan.w
10c50 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
10c60 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
10c70 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f 5f  E_IDX_ONLY | WO_
10c80 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  EQ;..  /* Constr
10c90 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
10ca0 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
10cb0 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
10cc0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
10cd0 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20  Index);.  nByte 
10ce0 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
10cf0 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49  f(int);     /* I
10d00 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f  ndex.aiColumn */
10d10 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
10d20 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  umn*sizeof(char*
10d30 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a  );   /* Index.az
10d40 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20  Coll */.  nByte 
10d50 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  += nColumn;     
10d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10d70 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
10d80 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
10d90 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10da0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
10db0 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  e);.  if( pIdx==
10dc0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c  0 ) return;.  pL
10dd0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
10de0 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
10df0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
10e00 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70  **)&pIdx[1];.  p
10e10 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
10e20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43  (int*)&pIdx->azC
10e30 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  oll[nColumn];.  
10e40 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
10e50 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61   = (u8*)&pIdx->a
10e60 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d  iColumn[nColumn]
10e70 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
10e80 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
10e90 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
10ea0 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64  = nColumn;.  pId
10eb0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
10ec0 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
10ed0 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
10ee0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
10ef0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
10f00 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
10f10 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
10f20 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
10f30 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
10f40 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
10f50 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10f60 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
10f70 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
10f80 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29  S ? ((Bitmask)1)
10f90 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69  <<(BMS-1) : ((Bi
10fa0 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a  tmask)1)<<iCol;.
10fb0 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
10fc0 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
10fd0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
10fe0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
10ff0 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
11000 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
11010 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
11020 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
11030 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
11040 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
11050 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
11060 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
11070 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
11080 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
11090 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
110a0 5d 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ] = pColl->zName
110b0 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
110c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
110d0 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
110e0 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  n==pLevel->plan.
110f0 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
11100 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
11110 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
11120 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
11130 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
11140 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
11150 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
11160 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
11170 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
11180 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
11190 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20  )1)<<i) ){.     
111a0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
111b0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
111c0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
111d0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
111e0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
111f0 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
11200 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
11210 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
11220 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
11230 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
11240 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
11250 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
11260 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
11270 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
11280 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
11290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
112a0 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( n==nColumn 
112b0 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
112c0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
112d0 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66  dex */.  pKeyinf
112e0 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
112f0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
11300 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28  pIdx);.  assert(
11310 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
11320 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=0 );.  sqlite3
11330 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11340 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
11350 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
11360 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20   nColumn+1, 0,. 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e     (char*)pKeyin
11390 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
113a0 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43  ANDOFF);.  VdbeC
113b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
113c0 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
113d0 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
113e0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
113f0 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
11400 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
11410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11420 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
11430 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
11440 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
11450 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11460 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
11470 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
11480 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
11490 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
114a0 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
114b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
114c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
114d0 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
114e0 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
114f0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
11500 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11510 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
11520 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ULT);.  sqlite3V
11530 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11540 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
11550 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
11560 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11570 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
11580 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
11590 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
115a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
115b0 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
115c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
115d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
115e0 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
115f0 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
11600 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
11610 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
11620 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11630 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
11640 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
11650 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11660 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
11670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11680 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11690 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
116a0 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
116b0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
116c0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
116d0 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
116e0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
116f0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
11700 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
11710 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
11720 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
11730 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
11740 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
11750 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
11760 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
11770 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11780 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
11790 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
117a0 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61  rse, .  WhereCla
117b0 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
117c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
117d0 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
117e0 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
117f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
11800 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
11810 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
11820 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
11830 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
11840 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
11850 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
11860 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
11870 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
11880 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
11890 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
118a0 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
118b0 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
118c0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
118d0 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54  xInfo;..  WHERET
118e0 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
118f0 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
11900 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63  r %s...\n", pSrc
11910 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
11920 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
11930 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
11940 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
11950 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
11960 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
11970 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
11980 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
11990 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
119a0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
119b0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
119c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
119d0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
119e0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
119f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
11a00 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
11a10 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
11a20 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
11a30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
11a40 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11a50 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
11a60 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
11a70 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
11a80 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
11a90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11aa0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
11ab0 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
11ac0 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
11ad0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
11ae0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
11af0 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
11b00 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
11b10 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
11b20 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
11b30 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
11b40 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
11b50 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
11b60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11b70 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
11b80 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
11b90 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
11ba0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11bb0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
11bc0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
11bd0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
11be0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
11bf0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
11c00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
11c10 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
11c20 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
11c30 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
11c40 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64  .    if( i==pOrd
11c50 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
11c60 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
11c70 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
11c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11c90 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
11ca0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11cb0 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
11cc0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
11cd0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11ce0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
11cf0 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
11d20 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
11d30 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
11d40 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
11d70 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
11d80 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
11d90 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
11da0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11db0 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
11dc0 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
11dd0 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
11de0 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
11df0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
11e00 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
11e10 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
11e20 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
11e30 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
11e40 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11e50 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
11e60 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
11e70 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
11e80 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
11e90 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
11ea0 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
11eb0 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
11ec0 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
11ed0 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
11ee0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
11ef0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
11f00 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
11f10 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
11f20 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
11f30 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
11f40 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
11f50 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
11f60 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
11f70 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
11f80 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
11f90 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
11fa0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
11fb0 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
11fc0 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
11fd0 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
11fe0 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
11ff0 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
12000 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
12010 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
12020 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
12030 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
12040 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
12050 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12060 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
12070 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
12080 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
12090 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
120a0 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
120b0 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
120c0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
120d0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
120e0 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
120f0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
12100 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
12150 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
12160 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
12170 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
12180 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
12190 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
121a0 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
121b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
121c0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
121d0 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
121e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
121f0 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
12200 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
12210 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
12220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12230 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
12240 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
12250 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
12260 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
12270 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
12280 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f  inue;.    pIdxCo
12290 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
122a0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
122b0 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
122c0 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
122d0 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f   = i;.    pIdxCo
122e0 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70  ns[j].op = (u8)p
122f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
12300 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
12310 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
12320 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
12330 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
12340 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
12350 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
12360 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12370 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
12380 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
12390 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
123a0 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
123b0 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
123c0 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
123d0 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
123e0 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
123f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
12400 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
12410 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
12420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
12430 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
12440 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
12450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
12460 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
12470 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
12480 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12490 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
124a0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
124b0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
124c0 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
124d0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
124e0 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
124f0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
12500 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
12510 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
12520 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
12530 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
12540 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
12550 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
12560 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
12570 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12580 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
12590 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
125a0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
125b0 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
125c0 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
125d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
125e0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
125f0 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
12600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
12610 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
12620 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
12630 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12640 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
12650 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
12660 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
12670 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
12680 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
12690 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
126a0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
126b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
126c0 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
126d0 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65  ndex_info pointe
126e0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
126f0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  he argument..**.
12700 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12710 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
12720 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12730 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
12740 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
12750 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
12760 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
12770 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
12780 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
12790 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
127a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
127b0 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
127c0 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
127d0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
127e0 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
127f0 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
12800 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
12810 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
12820 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
12830 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
12840 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
12850 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
12860 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
12870 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
12880 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
12890 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
128a0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
128b0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
128c0 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
128d0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
128e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
128f0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
12900 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
12910 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
12920 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
12930 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
12940 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
12950 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
12960 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
12970 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
12980 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
12990 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
129a0 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
129b0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
129c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
129d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
129e0 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
129f0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12a00 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
12a10 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
12a20 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
12a30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a40 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
12a50 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
12a60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12a70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12a80 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
12a90 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
12aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
12ab0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
12ac0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
12ad0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
12ae0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
12af0 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
12b00 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
12b10 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
12b20 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
12b30 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
12b40 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
12b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12b60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12b70 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
12b80 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
12b90 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
12ba0 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
12bb0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
12bc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
12bd0 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f  rse->nErr;.}.../
12be0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
12bf0 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20   best index for 
12c00 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12c10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20  .**.** The best 
12c20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65  index is compute
12c30 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
12c40 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
12c50 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
12c60 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73  le module.  This
12c70 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c   routine is real
12c80 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65  ly just a wrappe
12c90 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a  r that sets up.*
12ca0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
12cb0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
12cc0 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  re that is used 
12cd0 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77  to communicate w
12ce0 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ith.** xBestInde
12cf0 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f  x..**.** In a jo
12d00 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  in, this routine
12d10 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
12d20 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
12d30 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  for the.** same 
12d40 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
12d50 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
12d60 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12d70 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
12d80 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  nd initialized o
12d90 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
12da0 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  cation and reuse
12db0 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75  d on all subsequ
12dc0 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ent.** invocatio
12dd0 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ns.  The sqlite3
12de0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12df0 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73  cture is also us
12e00 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  ed when.** code 
12e10 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
12e20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75  access the virtu
12e30 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77  al table.  The w
12e40 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29  hereInfoDelete()
12e50 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b   .** routine tak
12e60 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  es care of freei
12e70 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ng the sqlite3_i
12e80 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12e90 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65  ure after.** eve
12ea0 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73  rybody has finis
12eb0 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a  hed with it..*/.
12ec0 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
12ed0 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20  VirtualIndex(.  
12ee0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
12f10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
12f20 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
12f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12f40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
12f50 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12f60 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12f70 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
12f80 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12f90 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
12fa0 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12fc0 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
12fd0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
12fe0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
12ff0 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
13000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13010 75 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64  ursors not valid
13020 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
13030 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13040 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
13050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64        /* The ord
13060 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  er by clause */.
13070 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
13080 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
13090 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
130a0 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20   query plan */. 
130b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
130c0 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20  nfo **ppIdxInfo 
130d0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
130e0 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
130f0 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
13100 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
13110 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
13120 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13130 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
13140 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13150 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
13160 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
13170 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13180 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
13190 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
131a0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
131b0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
131c0 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75   nOrderBy;.  dou
131d0 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a  ble rCost;..  /*
131e0 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61   Make sure wsFla
131f0 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  gs is initialize
13200 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76  d to some sane v
13210 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  alue. Otherwise,
13220 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61   if the .  ** ma
13230 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65  lloc in allocate
13240 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c  IndexInfo() fail
13250 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
13260 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76  ion returns leav
13270 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73  ing.  ** wsFlags
13280 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   in an uninitial
13290 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20  ized state, the 
132a0 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76  caller may behav
132b0 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e  e unpredictably.
132c0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  .  */.  memset(p
132d0 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Cost, 0, sizeof(
132e0 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73  *pCost));.  pCos
132f0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
13300 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
13310 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ABLE;..  /* If t
13320 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
13330 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
13340 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
13350 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
13360 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
13370 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c  alized, then all
13380 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
13390 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  lize it now..  *
133a0 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a  /.  pIdxInfo = *
133b0 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28  ppIdxInfo;.  if(
133c0 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
133d0 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
133e0 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
133f0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
13400 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
13410 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   pOrderBy);.  }.
13420 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
13430 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
13440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
13450 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71  is point, the sq
13460 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13470 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
13480 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a  pIdxInfo points.
13490 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76    ** to will hav
134a0 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  e been initializ
134b0 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e  ed, either durin
134c0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  g the current in
134d0 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a  vocation or.  **
134e0 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69   during some pri
134f0 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20  or invocation.  
13500 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65  Now we just have
13510 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68   to customize th
13520 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f  e.  ** details o
13530 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74  f pIdxInfo for t
13540 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
13550 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69  ation and pass i
13560 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49  t to.  ** xBestI
13570 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  ndex..  */..  /*
13580 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65   The module name
13590 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
135a0 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20  . Also, by this 
135b0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74  point there must
135c0 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74  .  ** be a point
135d0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
135e0 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
135f0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20   Otherwise.  ** 
13600 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
13610 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c  lumnNames() woul
13620 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70  d have picked up
13630 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a   the error. .  *
13640 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
13650 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26  ->azModuleArg &&
13660 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
13670 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72  rg[0] );.  asser
13680 74 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61  t( sqlite3GetVTa
13690 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
136a0 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  pTab) );..  /* S
136b0 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69  et the aConstrai
136c0 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c  nt[].usable fiel
136d0 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ds and initializ
136e0 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70  e all .  ** outp
136f0 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
13700 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
13710 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
13720 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72  able is true for
13730 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65   constraints whe
13740 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  re the right-han
13750 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74  d.  ** side cont
13760 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65  ains only refere
13770 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74  nces to tables t
13780 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
13790 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74  e current.  ** t
137a0 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
137b0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f  words, if the co
137c0 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
137d0 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
137e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  **           col
137f0 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a  umn = expr.  **.
13800 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20    ** and we are 
13810 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69  evaluating a joi
13820 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  n, then the cons
13830 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e  traint on column
13840 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76   is .  ** only v
13850 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c  alid if all tabl
13860 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e  es referenced in
13870 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74   expr occur to t
13880 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20  he left.  ** of 
13890 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
138a0 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a  ning column..  *
138b0 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73  *.  ** The aCons
138c0 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20  traints[] array 
138d0 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
138e0 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
138f0 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ints.  ** on the
13900 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
13910 20 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c   That way we onl
13920 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74  y have to comput
13930 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65  e it once.  ** e
13940 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69  ven though we mi
13950 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20  ght try to pick 
13960 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d  the best index m
13970 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20  ultiple times.. 
13980 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74   ** For each att
13990 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20  empt at picking 
139a0 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
139b0 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
139c0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d   the.  ** join m
139d0 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e  ight be differen
139e0 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  t so we have to 
139f0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73  recompute the us
13a00 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65  able flag.  ** e
13a10 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ach time..  */. 
13a20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
13a30 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13a40 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
13a50 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
13a60 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65  traint;.  pUsage
13a70 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
13a80 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
13a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
13aa0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
13ab0 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73  t; i++, pIdxCons
13ac0 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64  ++){.    j = pId
13ad0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
13ae0 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  et;.    pTerm = 
13af0 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20  &pWC->a[j];.    
13b00 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
13b10 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65   = (pTerm->prere
13b20 71 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29  qRight&notReady)
13b30 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20   ? 0 : 1;.  }.  
13b40 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
13b50 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
13b60 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
13b70 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66  onstraint);.  if
13b80 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  ( pIdxInfo->need
13b90 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
13ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13bb0 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
13bc0 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e  r);.  }.  pIdxIn
13bd0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
13be0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
13bf0 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
13c00 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
13c10 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
13c20 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
13c30 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20  sumed = 0;.  /* 
13c40 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63  ((double)2) In c
13c50 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
13c60 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13c70 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e  T... */.  pIdxIn
13c80 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
13c90 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
13ca0 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29  BL / ((double)2)
13cb0 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
13cc0 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
13cd0 79 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  y;.  if( !pOrder
13ce0 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  By ){.    pIdxIn
13cf0 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30  fo->nOrderBy = 0
13d00 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61  ;.  }..  if( vta
13d10 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73  bBestIndex(pPars
13d20 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66  e, pTab, pIdxInf
13d30 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
13d40 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e  ;.  }..  pIdxCon
13d50 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
13d60 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13d70 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
13d80 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
13d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
13da0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
13db0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  nt; i++){.    if
13dc0 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  ( pUsage[i].argv
13dd0 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
13de0 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20   pCost->used |= 
13df0 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b  pWC->a[pIdxCons[
13e00 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e  i].iTermOffset].
13e10 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
13e20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13e30 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
13e40 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64  R BY clause, and
13e50 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 76 69   the selected vi
13e60 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65  rtual table inde
13e70 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  x.  ** does not 
13e80 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72  satisfy it, incr
13e90 65 61 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66  ease the cost of
13ea0 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64   the scan accord
13eb0 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a  ingly. This.  **
13ec0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 72 6f   matches the pro
13ed0 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d  cessing for non-
13ee0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69  virtual tables i
13ef0 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78  n bestBtreeIndex
13f00 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74  ()..  */.  rCost
13f10 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74   = pIdxInfo->est
13f20 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66  imatedCost;.  if
13f30 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 49  ( pOrderBy && pI
13f40 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
13f50 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20  onsumed==0 ){.  
13f60 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f    rCost += estLo
13f70 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a  g(rCost)*rCost;.
13f80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
13f90 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  st is not allowe
13fa0 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  d to be larger t
13fb0 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  han SQLITE_BIG_D
13fc0 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69  BL (the.  ** ini
13fd0 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77  tal value of low
13fe0 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20  estCost in this 
13ff0 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20  loop. If it is, 
14000 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63  then the.  ** (c
14010 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20  ost<lowestCost) 
14020 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20  test below will 
14030 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20  never be true.. 
14040 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28   ** .  ** Use "(
14050 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61  double)2" instea
14060 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61  d of "2.0" in ca
14070 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  se OMIT_FLOATING
14080 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20  _POINT .  ** is 
14090 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  defined..  */.  
140a0 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f  if( (SQLITE_BIG_
140b0 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29  DBL/((double)2))
140c0 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43  <rCost ){.    pC
140d0 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51  ost->rCost = (SQ
140e0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
140f0 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c  ouble)2));.  }el
14100 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72  se{.    pCost->r
14110 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20  Cost = rCost;.  
14120 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  }.  pCost->plan.
14130 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49 64  u.pVtabIdx = pId
14140 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
14150 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
14160 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43  nsumed ){.    pC
14170 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
14180 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
14190 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d  BY;.  }.  pCost-
141a0 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20  >plan.nEq = 0;. 
141b0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
141c0 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
141d0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
141e0 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65  d a more efficie
141f0 6e 74 20 61 63 63 65 73 73 20 70 61 74 74 65 72  nt access patter
14200 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69  n by using multi
14210 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a  ple indexes.  **
14220 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20   to optimize an 
14230 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  OR expression wi
14240 74 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  thin the WHERE c
14250 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62  lause. .  */.  b
14260 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
14270 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
14280 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
14290 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
142a0 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64  , pCost);.}.#end
142b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
142c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
142d0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  /../*.** Argumen
142e0 74 20 70 49 64 78 20 69 73 20 61 20 70 6f 69 6e  t pIdx is a poin
142f0 74 65 72 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ter to an index 
14300 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
14310 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a  as an array of.*
14320 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  * SQLITE_INDEX_S
14330 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79 20 73 70  AMPLES evenly sp
14340 61 63 65 64 20 73 61 6d 70 6c 65 73 20 6f 66 20  aced samples of 
14350 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 65  the first indexe
14360 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72  d column.** stor
14370 65 64 20 69 6e 20 49 6e 64 65 78 2e 61 53 61 6d  ed in Index.aSam
14380 70 6c 65 2e 20 54 68 65 20 64 6f 6d 61 69 6e 20  ple. The domain 
14390 6f 66 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  of values stored
143a0 20 69 6e 20 73 61 69 64 20 63 6f 6c 75 6d 6e 0a   in said column.
143b0 2a 2a 20 6d 61 79 20 62 65 20 74 68 6f 75 67 68  ** may be though
143c0 74 20 6f 66 20 61 73 20 64 69 76 69 64 65 64 20  t of as divided 
143d0 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e 44  into (SQLITE_IND
143e0 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72 65  EX_SAMPLES+1) re
143f0 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e  gions..** Region
14400 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20   0 contains all 
14410 76 61 6c 75 65 73 20 73 6d 61 6c 6c 65 72 20 74  values smaller t
14420 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 73 61  han the first sa
14430 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67 69  mple value. Regi
14440 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e 73  on.** 1 contains
14450 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20 74   values larger t
14460 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
14470 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14480 20 66 69 72 73 74 20 73 61 6d 70 6c 65 2c 0a 2a   first sample,.*
14490 2a 20 62 75 74 20 73 6d 61 6c 6c 65 72 20 74 68  * but smaller th
144a0 61 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  an the value of 
144b0 74 68 65 20 73 65 63 6f 6e 64 2e 20 41 6e 64 20  the second. And 
144c0 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  so on..**.** If 
144d0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
144e0 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
144f0 69 6e 65 73 20 77 68 69 63 68 20 6f 66 20 74 68  ines which of th
14500 65 20 72 65 67 69 6f 6e 73 20 76 61 6c 75 65 20  e regions value 
14510 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73 20 69 6e  .** pVal lies in
14520 2c 20 73 65 74 73 20 2a 70 69 52 65 67 69 6f 6e  , sets *piRegion
14530 20 74 6f 20 74 68 65 20 72 65 67 69 6f 6e 20 69   to the region i
14540 6e 64 65 78 20 28 61 20 76 61 6c 75 65 20 62 65  ndex (a value be
14550 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53  tween 0.** and S
14560 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
14570 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65  LES+1, inclusive
14580 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  ) and returns SQ
14590 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
145a0 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  if an OOM occurs
145b0 20 77 68 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e   while convertin
145c0 67 20 74 65 78 74 20 76 61 6c 75 65 73 20 62 65  g text values be
145d0 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c  tween encodings,
145e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
145f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14600 20 2a 70 69 52 65 67 69 6f 6e 20 69 73 20 75 6e   *piRegion is un
14610 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64  defined..*/.#ifd
14620 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14630 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e  _STAT2.static in
14640 74 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  t whereRangeRegi
14650 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
14660 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
14670 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
14680 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
14690 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
146a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
146b0 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
146c0 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71  omain of */.  sq
146d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
146e0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l,        /* Val
146f0 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  ue to consider *
14700 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65 67 69 6f  /.  int *piRegio
14710 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
14720 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f  /* OUT: Region o
14730 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63  f domain in whic
14740 68 20 76 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a  h value lies */.
14750 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
14760 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  pVal) ){.    Ind
14770 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
14780 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
14790 65 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  e;.    int i = 0
147a0 3b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 20  ;.    int eType 
147b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
147c0 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 20  type(pVal);..   
147d0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
147e0 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54  TE_INTEGER || eT
147f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
14800 54 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  T ){.      doubl
14810 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
14820 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
14830 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14840 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   i<SQLITE_INDEX_
14850 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20  SAMPLES; i++){. 
14860 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
14870 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
14880 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
14890 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
148a0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
148b0 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e>=SQLITE_TEXT |
148c0 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  | aSample[i].u.r
148d0 3e 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >r ) break;.    
148e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 20 0a    }.    }else{ .
148f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
14900 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14910 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14920 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
14930 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
14940 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt n;..      /* 
14950 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f 6d 20  pVal comes from 
14960 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
14970 45 78 70 72 28 29 20 73 6f 20 74 68 65 20 74 79  Expr() so the ty
14980 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  pe cannot be NUL
14990 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  L */.      asser
149a0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
149b0 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d  _TEXT || eType==
149c0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a  SQLITE_BLOB );..
149d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
149e0 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
149f0 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
14a00 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f  st u8 *)sqlite3_
14a10 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
14a20 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
14a30 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
14a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14a50 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c   pColl->enc==SQL
14a60 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20  ITE_UTF8 );.    
14a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14a80 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14a90 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  GetCollSeq(db, S
14aa0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
14ab0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
14ac0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
14ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14ae0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14af0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
14b00 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
14b10 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20 20 20  ence: %s",.     
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f       *pIdx->azCo
14b40 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ll);.          r
14b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14b60 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
14b70 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
14b80 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c   u8 *)sqlite3Val
14b90 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f  ueText(pVal, pCo
14ba0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20  ll->enc);.      
14bb0 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20    if( !z ){.    
14bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14bd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14be0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
14bf0 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20  ert( z && pColl 
14c00 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14c20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  n = sqlite3Value
14c30 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c  Bytes(pVal, pCol
14c40 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20 20 20  l->enc);..      
14c50 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
14c60 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
14c70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
14c80 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt r;.        in
14c90 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20  t eSampletype = 
14ca0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
14cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53  ;.        if( eS
14cc0 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c 49 54  ampletype==SQLIT
14cd0 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c  E_NULL || eSampl
14ce0 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
14cf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14d00 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79 70 65  if( (eSampletype
14d10 21 3d 65 54 79 70 65 29 20 29 20 62 72 65 61 6b  !=eType) ) break
14d20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14d30 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
14d40 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65      if( pColl->e
14d50 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
14d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
14d70 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20   nSample;.      
14d80 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c      char *zSampl
14d90 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74  e = sqlite3Utf8t
14da0 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20  o16(.           
14db0 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e     db, pColl->en
14dc0 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  c, aSample[i].u.
14dd0 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  z, aSample[i].nB
14de0 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20  yte, &nSample.  
14df0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
14e00 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c       if( !zSampl
14e10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14e20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
14e30 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14e40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14e70 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d 3e 78      r = pColl->x
14e80 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
14e90 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70  , nSample, zSamp
14ea0 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  le, n, z);.     
14eb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
14ec0 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b  ee(db, zSample);
14ed0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
14ee0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
14ef0 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 70 43            r = pC
14f00 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
14f10 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b  >pUser, aSample[
14f20 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c  i].nByte, aSampl
14f30 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b  e[i].u.z, n, z);
14f40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14f50 20 20 20 69 66 28 20 72 3e 30 20 29 20 62 72 65     if( r>0 ) bre
14f60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14f70 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  }..    assert( i
14f80 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c 49 54 45  >=0 && i<=SQLITE
14f90 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
14fa0 3b 0a 20 20 20 20 2a 70 69 52 65 67 69 6f 6e 20  ;.    *piRegion 
14fb0 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
14fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
14fd0 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 66 64 65  endif   /* #ifde
14fe0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14ff0 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT2 */../*.** 
15000 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
15010 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
15020 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
15030 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
15040 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
15050 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
15060 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
15070 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
15080 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
15090 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
150a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
150b0 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
150c0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
150d0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
150e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
150f0 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
15100 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
15110 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
15120 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
15130 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
15140 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
15150 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
15160 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
15170 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
15180 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
15190 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
151a0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
151b0 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
151c0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
151d0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
151e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
151f0 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
15200 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
15210 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
15220 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
15230 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
15240 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
15250 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
15260 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
15270 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
15280 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
15290 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
152a0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
152b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
152c0 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT2.static int 
152d0 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
152e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
152f0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
15300 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
15310 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
15320 0a 29 7b 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  .){.  /* The eva
15330 6c 43 6f 6e 73 74 45 78 70 72 28 29 20 66 75 6e  lConstExpr() fun
15340 63 74 69 6f 6e 20 77 69 6c 6c 20 68 61 76 65 20  ction will have 
15350 61 6c 72 65 61 64 79 20 63 6f 6e 76 65 72 74 65  already converte
15360 64 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  d any TK_VARIABL
15370 45 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  E.  ** expressio
15380 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 61 6e  n involved in an
15390 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 74 6f   comparison into
153a0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20   a TK_REGISTER. 
153b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
153c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 56 41 52 49 41  pr->op!=TK_VARIA
153d0 42 4c 45 20 29 3b 0a 20 20 69 66 28 20 70 45 78  BLE );.  if( pEx
153e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
153f0 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
15400 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  2==TK_VARIABLE )
15410 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d  {.    int iVar =
15420 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15430 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15440 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
15450 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b  e->pVdbe, iVar);
15460 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37   /* IMP: R-23257
15470 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a 70  -02778 */.    *p
15480 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
15490 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
154a0 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
154b0 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
154c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
154d0 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
154e0 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
154f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
15500 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
15510 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
15520 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
15530 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
15540 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
15550 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
15560 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
15570 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
15580 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
15590 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
155a0 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
155b0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
155c0 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
155d0 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
155e0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
155f0 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
15600 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
15610 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
15620 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
15630 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
15640 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
15650 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
15660 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
15670 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
15680 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
15690 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
156a0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
156b0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
156c0 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
156d0 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
15700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15710 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
15720 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
15730 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
15740 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
15750 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
15760 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
15770 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
15780 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
15790 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
157a0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
157b0 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
157c0 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
157d0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
157e0 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
157f0 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
15800 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
15810 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
15820 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
15830 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
15840 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
15850 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
15860 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
15870 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
15880 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
15890 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
158a0 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
158b0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
158c0 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
158d0 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
158e0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
158f0 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
15900 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
15910 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
15920 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
15930 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
15940 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
15950 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
15960 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
15970 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
15980 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
15990 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
159a0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
159b0 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
159c0 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
159d0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
159e0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
159f0 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  er between 1 and
15a00 20 31 30 30 2c 20 69 6e 63 6c 75 73 69 76 65 2e   100, inclusive.
15a10 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c   A return.** val
15a20 75 65 20 6f 66 20 31 20 69 6e 64 69 63 61 74 65  ue of 1 indicate
15a30 73 20 74 68 61 74 20 74 68 65 20 70 72 6f 70 6f  s that the propo
15a40 73 65 64 20 72 61 6e 67 65 20 73 63 61 6e 20 69  sed range scan i
15a50 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
15a60 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78 69 6d 61  sit.** approxima
15a70 74 65 6c 79 20 31 2f 31 30 30 74 68 20 28 31 25  tely 1/100th (1%
15a80 29 20 6f 66 20 74 68 65 20 72 6f 77 73 20 73 65  ) of the rows se
15a90 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 6e 45  lected by the nE
15aa0 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  q equality.** co
15ab0 6e 73 74 72 61 69 6e 74 73 20 28 69 66 20 61 6e  nstraints (if an
15ac0 79 29 2e 20 41 20 72 65 74 75 72 6e 20 76 61 6c  y). A return val
15ad0 75 65 20 6f 66 20 31 30 30 20 69 6e 64 69 63 61  ue of 100 indica
15ae0 74 65 73 20 74 68 61 74 20 69 74 20 69 73 20 65  tes that it is e
15af0 78 70 65 63 74 65 64 0a 2a 2a 20 74 68 61 74 20  xpected.** that 
15b00 74 68 65 20 72 61 6e 67 65 20 73 63 61 6e 20 77  the range scan w
15b10 69 6c 6c 20 76 69 73 69 74 20 65 76 65 72 79 20  ill visit every 
15b20 72 6f 77 20 28 31 30 30 25 29 20 73 65 6c 65 63  row (100%) selec
15b30 74 65 64 20 62 79 20 74 68 65 20 65 71 75 61 6c  ted by the equal
15b40 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
15b50 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ts..**.** In the
15b60 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
15b70 74 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45  te_stat2 ANALYZE
15b80 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67   data, each rang
15b90 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20  e inequality.** 
15ba0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
15bb0 63 68 20 73 70 61 63 65 20 62 79 20 32 2f 33 72  ch space by 2/3r
15bc0 64 73 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e  ds.  Hence a sin
15bd0 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  gle constraint (
15be0 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20  x>?).** results 
15bf0 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 33  in a return of 3
15c00 33 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f  3 and a range co
15c10 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e  nstraint (x>? AN
15c20 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a  D x<?) results.*
15c30 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  * in a return of
15c40 20 31 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   11..*/.static i
15c50 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
15c60 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
15c70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15c80 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
15c90 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15ca0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15cc0 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
15cd0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f  ing the range-co
15ce0 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22  mpared column; "
15cf0 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  x" */.  int nEq,
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d10 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43  index into p->aC
15d20 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67  ol[] of the rang
15d30 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
15d40 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
15d50 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
15d60 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
15d70 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
15d80 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
15d90 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
15da0 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
15db0 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
15dc0 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
15dd0 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
15de0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ULL */.  int *pi
15df0 45 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Est           /*
15e00 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 76 61 6c   OUT: Return val
15e10 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
15e20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15e30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15e40 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20 69 66  ABLE_STAT2..  if
15e50 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 61  ( nEq==0 && p->a
15e60 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
15e70 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 6f  lite3_value *pLo
15e80 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  werVal = 0;.    
15e90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15ea0 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20  UpperVal = 0;.  
15eb0 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20 20 20    int iEst;.    
15ec0 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  int iLower = 0;.
15ed0 20 20 20 20 69 6e 74 20 69 55 70 70 65 72 20 3d      int iUpper =
15ee0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
15ef0 4d 50 4c 45 53 3b 0a 20 20 20 20 75 38 20 61 66  MPLES;.    u8 af
15f00 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
15f10 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
15f20 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
15f30 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
15f40 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15f50 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
15f60 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
15f70 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
15f80 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
15f90 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65 72  pr, aff, &pLower
15fa0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
15fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15fc0 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
15fd0 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
15fe0 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
15ff0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
16000 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
16010 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
16020 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56 61  , aff, &pUpperVa
16030 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l);.    }..    i
16040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16050 20 7c 7c 20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d   || (pLowerVal==
16060 30 20 26 26 20 70 55 70 70 65 72 56 61 6c 3d 3d  0 && pUpperVal==
16070 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
16080 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f  te3ValueFree(pLo
16090 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 73  werVal);.      s
160a0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
160b0 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20  pUpperVal);.    
160c0 20 20 67 6f 74 6f 20 72 61 6e 67 65 5f 65 73 74    goto range_est
160d0 5f 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  _fallback;.    }
160e0 65 6c 73 65 20 69 66 28 20 70 4c 6f 77 65 72 56  else if( pLowerV
160f0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
16100 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65  c = whereRangeRe
16110 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  gion(pParse, p, 
16120 70 55 70 70 65 72 56 61 6c 2c 20 26 69 55 70 70  pUpperVal, &iUpp
16130 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
16140 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
16150 20 69 55 70 70 65 72 2f 32 3b 0a 20 20 20 20 7d   iUpper/2;.    }
16160 65 6c 73 65 20 69 66 28 20 70 55 70 70 65 72 56  else if( pUpperV
16170 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
16180 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65  c = whereRangeRe
16190 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  gion(pParse, p, 
161a0 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69 4c 6f 77  pLowerVal, &iLow
161b0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
161c0 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
161d0 20 28 69 4c 6f 77 65 72 20 2b 20 53 51 4c 49 54   (iLower + SQLIT
161e0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
161f0 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d 65 6c 73  + 1)/2;.    }els
16200 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
16210 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
16220 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72  Parse, p, pUpper
16230 56 61 6c 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  Val, &iUpper);. 
16240 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16260 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
16270 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
16280 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69  p, pLowerVal, &i
16290 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Lower);.      }.
162a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 45 73 74 20      }..    iEst 
162b0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
162c0 72 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  r;.    testcase(
162d0 20 69 45 73 74 3d 3d 53 51 4c 49 54 45 5f 49 4e   iEst==SQLITE_IN
162e0 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
162f0 20 20 20 61 73 73 65 72 74 28 20 69 45 73 74 3c     assert( iEst<
16300 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  =SQLITE_INDEX_SA
16310 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 69 66 28  MPLES );.    if(
16320 20 69 45 73 74 3c 31 20 29 7b 0a 20 20 20 20 20   iEst<1 ){.     
16330 20 69 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d   iEst = 1;.    }
16340 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ..    sqlite3Val
16350 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c  ueFree(pLowerVal
16360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
16370 6c 75 65 46 72 65 65 28 70 55 70 70 65 72 56 61  lueFree(pUpperVa
16380 6c 29 3b 0a 20 20 20 20 2a 70 69 45 73 74 20 3d  l);.    *piEst =
16390 20 28 69 45 73 74 20 2a 20 31 30 30 29 2f 53 51   (iEst * 100)/SQ
163a0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
163b0 45 53 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ES;.    return r
163c0 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f 65 73 74  c;.  }.range_est
163d0 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65 6c 73 65  _fallback:.#else
163e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
163f0 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
16400 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16410 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
16420 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
16430 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
16440 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
16450 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26  ;.  if( pLower &
16460 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
16470 2a 70 69 45 73 74 20 3d 20 31 31 3b 0a 20 20 7d  *piEst = 11;.  }
16480 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 45 73 74  else{.    *piEst
16490 20 3d 20 33 33 3b 0a 20 20 7d 0a 20 20 72 65 74   = 33;.  }.  ret
164a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
164b0 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
164c0 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
164d0 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
164e0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
164f0 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
16500 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
16510 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
16520 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
16530 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  plied as the.** 
16540 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  last parameter..
16550 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
16560 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e   cost plan wins.
16570 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
16580 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
16590 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
165a0 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
165b0 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
165c0 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
165d0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 6c   the selected pl
165e0 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  an..** Factors t
165f0 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
16600 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
16610 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
16620 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
16630 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16640 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
16650 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
16660 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
16670 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
16680 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
16690 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
166a0 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
166b0 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
166c0 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
166d0 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
166e0 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
166f0 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
16700 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
16710 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
16720 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ED BY clause (pS
16730 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
16740 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
16750 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
16760 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
16770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
16780 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
16790 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
167a0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
167b0 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73   no such plan is
167c0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
167d0 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
167e0 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
167f0 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69  DBL. If a plan i
16800 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65  s found that use
16810 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  s the named inde
16820 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  x, .** then the 
16830 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74  cost is calculat
16840 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20  ed in the usual 
16850 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  way..**.** If a 
16860 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
16870 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  se (pSrc->notInd
16880 65 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74  exed!=0) was att
16890 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
168a0 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45  le .** in the SE
168b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
168c0 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
168d0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
168e0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a  However, the .**
168f0 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d   selected plan m
16900 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64  ay still take ad
16910 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 74  vantage of the t
16920 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e 20 72  ables built-in r
16930 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  owid.** index..*
16940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
16950 73 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  stBtreeIndex(.  
16960 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16980 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
16990 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
169a0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
169b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
169c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
169d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
169e0 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
169f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
16a00 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
16a10 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
16a20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
16a30 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e  ask of cursors n
16a40 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
16a50 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
16a60 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c  itmask notValid,
16a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
16a80 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61  rsors not availa
16a90 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70  ble for any purp
16aa0 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ose */.  ExprLis
16ab0 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
16ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
16ad0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
16ae0 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
16af0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
16b00 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
16b10 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69  y plan */.){.  i
16b20 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
16b30 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
16b40 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
16b50 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
16b60 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ssed */.  Index 
16b70 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20  *pProbe;        
16b80 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
16b90 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  x we are evaluat
16ba0 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ing */.  Index *
16bb0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
16bc0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
16bd0 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20  pProbe, or zero 
16be0 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f  for IPK index */
16bf0 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73  .  int eqTermMas
16c00 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
16c10 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f  * Current mask o
16c20 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
16c30 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
16c40 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73  int idxEqTermMas
16c50 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  k;          /* I
16c60 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c  ndex mask of val
16c70 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  id equality oper
16c80 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78  ators */.  Index
16c90 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
16ca0 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
16cb0 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
16cc0 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
16cd0 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  y */.  unsigned 
16ce0 69 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  int aiRowEstPk[2
16cf0 5d 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45  ]; /* The aiRowE
16d00 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  st[] value for t
16d10 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
16d20 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b    int aiColumnPk
16d30 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a   = -1;        /*
16d40 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76   The aColumn[] v
16d50 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
16d60 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
16d70 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20  wsFlagMask;     
16d80 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
16d90 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f 73  ed flags in pCos
16da0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a  t->plan.wsFlag *
16db0 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
16dc0 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20 61  ze the cost to a
16dd0 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c 75   worst-case valu
16de0 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43  e */.  memset(pC
16df0 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
16e00 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74  pCost));.  pCost
16e10 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  ->rCost = SQLITE
16e20 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20  _BIG_DBL;..  /* 
16e30 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  If the pSrc tabl
16e40 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
16e50 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
16e60 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20  OIN then we may 
16e70 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20  not.  ** use an 
16e80 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79  index to satisfy
16e90 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61   IS NULL constra
16ea0 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62  ints on that tab
16eb0 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  le.  This is.  *
16ec0 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  * because column
16ed0 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  s might end up b
16ee0 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65  eing NULL if the
16ef0 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
16f00 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63  match -.  ** a c
16f10 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63  ircumstance whic
16f20 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  h the index cann
16f30 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f  ot help us disco
16f40 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31  ver.  Ticket #21
16f50 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  77..  */.  if( p
16f60 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  Src->jointype & 
16f70 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69  JT_LEFT ){.    i
16f80 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57  dxEqTermMask = W
16f90 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65  O_EQ|WO_IN;.  }e
16fa0 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65  lse{.    idxEqTe
16fb0 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
16fc0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
16fd0 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d    }..  if( pSrc-
16fe0 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f  >pIndex ){.    /
16ff0 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20  * An INDEXED BY 
17000 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
17010 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
17020 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  dex to use */.  
17030 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20    pIdx = pProbe 
17040 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a  = pSrc->pIndex;.
17050 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d      wsFlagMask =
17060 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   ~(WHERE_ROWID_E
17070 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
17080 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d  NGE);.    eqTerm
17090 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d  Mask = idxEqTerm
170a0 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mask;.  }else{. 
170b0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
170c0 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
170d0 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
170e0 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
170f0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 70 72 65   to.    ** repre
17100 73 65 6e 74 20 74 68 65 20 70 72 69 6d 61 72 79  sent the primary
17110 20 6b 65 79 20 2a 2f 0a 20 20 20 20 49 6e 64 65   key */.    Inde
17120 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
17130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79            /* Any
17140 20 6f 74 68 65 72 20 69 6e 64 65 78 20 6f 6e 20   other index on 
17150 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
17160 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
17170 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
17180 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
17190 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
171a0 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
171b0 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
171c0 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
171d0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
171e0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
171f0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
17200 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
17210 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
17220 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
17230 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
17240 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
17250 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
17260 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
17270 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
17280 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
17290 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20        sPk.pNext 
172a0 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a  = pFirst;.    }.
172b0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50      pProbe = &sP
172c0 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  k;.    wsFlagMas
172d0 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57  k = ~(.        W
172e0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
172f0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57  HERE_COLUMN_EQ|W
17300 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
17310 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
17320 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65  NGE.    );.    e
17330 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
17340 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64  Q|WO_IN;.    pId
17350 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
17360 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
17370 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ndices looking f
17380 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20  or the best one 
17390 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  to use.  */.  fo
173a0 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78  r(; pProbe; pIdx
173b0 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e  =pProbe=pProbe->
173c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73  pNext){.    cons
173d0 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  t unsigned int *
173e0 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20   const aiRowEst 
173f0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  = pProbe->aiRowE
17400 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63  st;.    double c
17410 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
17420 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75      /* Cost of u
17430 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20  sing pProbe */. 
17440 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20     double nRow; 
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17460 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
17470 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65  er of rows in re
17480 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
17490 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20  int rev;        
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
174b0 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  rue to scan in r
174c0 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
174d0 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
174e0 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  = 0;.    Bitmask
174f0 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20   used = 0;..    
17500 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
17510 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70   variables are p
17520 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  opulated based o
17530 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69 65 73  n the properties
17540 20 6f 66 0a 20 20 20 20 2a 2a 20 73 63 61 6e 20   of.    ** scan 
17550 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2e  being evaluated.
17560 20 54 68 65 79 20 61 72 65 20 74 68 65 6e 20 75   They are then u
17570 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
17580 20 74 68 65 20 65 78 70 65 63 74 65 64 0a 20 20   the expected.  
17590 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75    ** cost and nu
175a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74  mber of rows ret
175b0 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  urned..    **.  
175c0 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20    **  nEq: .    
175d0 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  **    Number of 
175e0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 74  equality terms t
175f0 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70 6c 65  hat can be imple
17600 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65  mented using the
17610 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
17620 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20     **  nInMul:  
17630 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22  .    **    The "
17640 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20  in-multiplier". 
17650 54 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d  This is an estim
17660 61 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20  ate of how many 
17670 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
17680 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74  .    **    SQLit
17690 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f  e must perform o
176a0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71  n the index in q
176b0 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61  uestion. For exa
176c0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
176d0 20 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c    **    WHERE cl
176e0 61 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a  ause is:.    **.
176f0 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52      **      WHER
17700 45 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29  E a IN (1, 2, 3)
17710 20 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c   AND b IN (4, 5,
17720 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   6).    **.    *
17730 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74  *    SQLite must
17740 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75   perform 9 looku
17750 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f  ps on an index o
17760 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e  n (a, b), so nIn
17770 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20  Mul is .    **  
17780 20 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65    set to 9. Give
17790 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d  n the same schem
177a0 61 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20  a and either of 
177b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48  the following WH
177c0 45 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63  ERE .    **    c
177d0 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20  lauses:.    **. 
177e0 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
177f0 20 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20   a =  1.    **  
17800 20 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32      WHERE a >= 2
17810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17820 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20    nInMul is set 
17830 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  to 1..    **.   
17840 20 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20   **    If there 
17850 65 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74  exists a WHERE t
17860 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
17870 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  "x IN (SELECT ..
17880 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a  .)", then .    *
17890 2a 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c  *    the sub-sel
178a0 65 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74  ect is assumed t
178b0 6f 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73  o return 25 rows
178c0 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
178d0 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20  s of .    **    
178e0 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d  determining nInM
178f0 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ul..    **.    *
17900 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20  *  bInEst:  .   
17910 20 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72   **    Set to tr
17920 75 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ue if there was 
17930 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20  at least one "x 
17940 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
17950 20 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20   term used .    
17960 2a 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69  **    in determi
17970 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f  ning the value o
17980 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a  f nInMul..    **
17990 0a 20 20 20 20 2a 2a 20 20 65 73 74 42 6f 75 6e  .    **  estBoun
179a0 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20  d:.    **    An 
179b0 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20  estimate on the 
179c0 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 61  amount of the ta
179d0 62 6c 65 20 74 68 61 74 20 6d 75 73 74 20 62 65  ble that must be
179e0 20 73 65 61 72 63 68 65 64 2e 20 20 41 0a 20 20   searched.  A.  
179f0 20 20 2a 2a 20 20 20 20 76 61 6c 75 65 20 6f 66    **    value of
17a00 20 31 30 30 20 6d 65 61 6e 73 20 74 68 65 20 65   100 means the e
17a10 6e 74 69 72 65 20 74 61 62 6c 65 20 69 73 20 73  ntire table is s
17a20 65 61 72 63 68 65 64 2e 20 20 52 61 6e 67 65 20  earched.  Range 
17a30 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
17a40 2a 2a 20 20 20 20 6d 69 67 68 74 20 72 65 64 75  **    might redu
17a50 63 65 20 74 68 69 73 20 74 6f 20 61 20 76 61 6c  ce this to a val
17a60 75 65 20 6c 65 73 73 20 74 68 61 6e 20 31 30 30  ue less than 100
17a70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
17a80 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  t only.    **   
17a90 20 61 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 74   a fraction of t
17aa0 68 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 73  he table needs s
17ab0 65 61 72 63 68 69 6e 67 2e 20 20 49 6e 20 74 68  earching.  In th
17ac0 65 20 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20  e absence of.   
17ad0 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f 73 74   **    sqlite_st
17ae0 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at2 ANALYZE data
17af0 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75  , a single inequ
17b00 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
17b10 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20  e search.    ** 
17b20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f 33 72     space to 1/3r
17b30 64 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  d its original s
17b40 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e 3f 20  ize.  So an x>? 
17b50 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
17b60 65 73 0a 20 20 20 20 2a 2a 20 20 20 20 65 73 74  es.    **    est
17b70 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20 54 77  Bound to 33.  Tw
17b80 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  o constraints (x
17b90 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
17ba0 63 65 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 31  ce estBound to 1
17bb0 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
17bc0 20 20 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20    bSort:   .    
17bd0 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54  **    Boolean. T
17be0 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
17bf0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
17c00 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  se that will req
17c10 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20  uire an .    ** 
17c20 20 20 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74     external sort
17c30 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20   (i.e. scanning 
17c40 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  the index being 
17c50 65 76 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e  evaluated will n
17c60 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f  ot .    **    co
17c70 72 72 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65  rrectly order re
17c80 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  cords)..    **. 
17c90 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20     **  bLookup: 
17ca0 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65  .    **    Boole
17cb0 61 6e 2e 20 54 72 75 65 20 69 66 20 66 6f 72 20  an. True if for 
17cc0 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79  each index entry
17cd0 20 76 69 73 69 74 65 64 20 61 20 6c 6f 6f 6b 75   visited a looku
17ce0 70 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  p on the .    **
17cf0 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
17d00 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 69  g table b-tree i
17d10 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
17d20 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
17d30 20 0a 20 20 20 20 2a 2a 20 20 20 20 66 6f 72 20   .    **    for 
17d40 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 2e  the rowid index.
17d50 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78   For other index
17d60 65 73 2c 20 69 74 20 69 73 20 74 72 75 65 20 75  es, it is true u
17d70 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 0a 20  nless all the . 
17d80 20 20 20 2a 2a 20 20 20 20 63 6f 6c 75 6d 6e 73     **    columns
17d90 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 73   of the table us
17da0 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
17db0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70   statement are p
17dc0 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a  resent in .    *
17dd0 2a 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 28  *    the index (
17de0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 20 69 73  such an index is
17df0 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72   sometimes descr
17e00 69 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69  ibed as a coveri
17e10 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a  ng index)..    *
17e20 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
17e30 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65  , given the inde
17e40 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
17e50 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66   second of the f
17e60 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a  ollowing .    **
17e70 20 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20      two queries 
17e80 72 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62  requires table b
17e90 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 2c 20 62  -tree lookups, b
17ea0 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65  ut the first doe
17eb0 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  s not..    **.  
17ec0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
17ed0 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20   SELECT a, b    
17ee0 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
17ef0 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20   = 1;.    **    
17f00 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
17f10 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c  a, b, c FROM tbl
17f20 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
17f30 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71    */.    int nEq
17f40 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74  ;.    int bInEst
17f50 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 49   = 0;.    int nI
17f60 6e 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 6e  nMul = 1;.    in
17f70 74 20 65 73 74 42 6f 75 6e 64 20 3d 20 31 30 30  t estBound = 100
17f80 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64  ;.    int nBound
17f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17fa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
17fb0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
17fc0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   seen */.    int
17fd0 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   bSort = 0;.    
17fe0 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b  int bLookup = 0;
17ff0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
18000 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
18010 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
18020 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
18030 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lause */..    /*
18040 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
18050 61 6c 75 65 73 20 6f 66 20 6e 45 71 20 61 6e 64  alues of nEq and
18060 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66   nInMul */.    f
18070 6f 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50  or(nEq=0; nEq<pP
18080 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e  robe->nColumn; n
18090 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  Eq++){.      int
180a0 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
180b0 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
180c0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
180d0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
180e0 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72   notReady, eqTer
180f0 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20  mMask, pIdx);.  
18100 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
18110 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18120 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
18130 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
18140 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20  E_ROWID_EQ);.   
18150 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
18160 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
18170 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
18180 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
18190 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77  pExpr;.        w
181a0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
181b0 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
181c0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
181d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
181e0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
181f0 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20           nInMul 
18200 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 20  *= 25;.         
18210 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20 20   bInEst = 1;.   
18220 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
18230 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
18240 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
18250 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78     nInMul *= pEx
18260 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
18270 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  pr + 1;.        
18280 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
18290 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
182a0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
182b0 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
182c0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
182d0 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  N_NULL;.      }.
182e0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
182f0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
18300 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18310 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
18320 6c 75 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e  lue of estBound.
18330 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c   */.    if( nEq<
18340 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
18350 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
18360 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
18370 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 69 66  n[nEq];.      if
18380 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
18390 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
183a0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
183b0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
183c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ) ){.        Whe
183d0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66  reTerm *pTop = f
183e0 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
183f0 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
18400 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64  WO_LT|WO_LE, pId
18410 78 29 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  x);.        Wher
18420 65 54 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69  eTerm *pBtm = fi
18430 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
18440 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
18450 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
18460 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
18470 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
18480 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71  rse, pProbe, nEq
18490 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 65  , pBtm, pTop, &e
184a0 73 74 42 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20  stBound);.      
184b0 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20    if( pTop ){.  
184c0 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d          nBound =
184d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73   1;.          ws
184e0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
184f0 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
18500 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70      used |= pTop
18510 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
18520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18530 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
18540 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
18550 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
18560 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
18570 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
18580 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70   used |= pBtm->p
18590 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
185a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73      }.        ws
185b0 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f  Flags |= (WHERE_
185c0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
185d0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b  RE_ROWID_RANGE);
185e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
185f0 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f  se if( pProbe->o
18600 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
18610 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
18620 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
18630 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a  RE_COLUMN_IN );.
18640 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18650 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18660 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20  COLUMN_NULL );. 
18670 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67       if( (wsFlag
18680 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
18690 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
186a0 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20  N_NULL))==0 ){. 
186b0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
186c0 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
186d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
186e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
186f0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
18700 61 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64  ause and the ind
18710 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
18720 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  red will.    ** 
18730 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72  naturally scan r
18740 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 69  ows in the requi
18750 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74  red order, set t
18760 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  he appropriate f
18770 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77  lags.    ** in w
18780 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
18790 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
187a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
187b0 65 20 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a  e but the index.
187c0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e      ** will scan
187d0 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65   rows in a diffe
187e0 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20  rent order, set 
187f0 74 68 65 20 62 53 6f 72 74 20 76 61 72 69 61 62  the bSort variab
18800 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
18810 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18820 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
18830 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49   (WHERE_COLUMN_I
18840 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  N|WHERE_COLUMN_N
18850 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  ULL))==0.       
18860 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49 6e 64   && isSortingInd
18870 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70  ex(pParse,pWC->p
18880 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69  MaskSet,pProbe,i
18890 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71  Cur,pOrderBy,nEq
188a0 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29 7b 0a  ,&rev).      ){.
188b0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
188c0 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  |= WHERE_ROWID_R
188d0 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
188e0 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52  N_RANGE|WHERE_OR
188f0 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 77  DERBY;.        w
18900 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f  sFlags |= (rev ?
18910 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a   WHERE_REVERSE :
18920 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
18930 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74 20  {.        bSort 
18940 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18950 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 75   }..    /* If cu
18960 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74  rrently calculat
18970 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ing the cost of 
18980 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 28  using an index (
18990 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20 20 20  not the IPK.    
189a0 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74 65 72  ** index), deter
189b0 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65 71 75  mine if all requ
189c0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61  ired column data
189d0 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
189e0 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a   without .    **
189f0 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20   using the main 
18a00 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66 20 74  table (i.e. if t
18a10 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 63 6f  he index is a co
18a20 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e  vering.    ** in
18a30 64 65 78 20 66 6f 72 20 74 68 69 73 20 71 75 65  dex for this que
18a40 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20 73  ry). If it is, s
18a50 65 74 20 74 68 65 20 57 48 45 52 45 5f 49 44 58  et the WHERE_IDX
18a60 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20  _ONLY flag in.  
18a70 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f 74    ** wsFlags. Ot
18a80 68 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65  herwise, set the
18a90 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c   bLookup variabl
18aa0 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e to true.  */. 
18ab0 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 77     if( pIdx && w
18ac0 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  sFlags ){.      
18ad0 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
18ae0 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
18af0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
18b00 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
18b10 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
18b20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49        int x = pI
18b30 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
18b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
18b50 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
18b60 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
18b70 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
18b80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18b90 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
18ba0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
18bb0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
18bc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18bd0 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d         bLookup =
18be0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18bf0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18c00 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
18c10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
18c20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20  output.  For an 
18c30 49 4e 20 6f 70 65 72 61 74 6f 72 2c 0a 20 20 20  IN operator,.   
18c40 20 2a 2a 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74   ** do not let t
18c50 68 65 20 65 73 74 69 6d 61 74 65 20 65 78 63 65  he estimate exce
18c60 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73  ed half the rows
18c70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
18c80 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d     */.    nRow =
18c90 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45   (double)(aiRowE
18ca0 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c  st[nEq] * nInMul
18cb0 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73  );.    if( bInEs
18cc0 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f  t && nRow*2>aiRo
18cd0 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  wEst[0] ){.     
18ce0 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74   nRow = aiRowEst
18cf0 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e  [0]/2;.      nIn
18d00 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77  Mul = (int)(nRow
18d10 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d   / aiRowEst[nEq]
18d20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18d30 20 41 73 73 75 6d 65 20 63 6f 6e 73 74 61 6e 74   Assume constant
18d40 20 63 6f 73 74 20 74 6f 20 61 63 63 65 73 73 20   cost to access 
18d50 61 20 72 6f 77 20 61 6e 64 20 6c 6f 67 61 72 69  a row and logari
18d60 74 68 6d 69 63 20 63 6f 73 74 20 74 6f 0a 20 20  thmic cost to.  
18d70 20 20 2a 2a 20 64 6f 20 61 20 62 69 6e 61 72 79    ** do a binary
18d80 20 73 65 61 72 63 68 2e 20 20 48 65 6e 63 65 2c   search.  Hence,
18d90 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 73   the initial cos
18da0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
18db0 6f 66 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a  of output.    **
18dc0 20 72 6f 77 73 20 70 6c 75 73 20 6c 6f 67 32 28   rows plus log2(
18dd0 74 61 62 6c 65 2d 73 69 7a 65 29 20 74 69 6d 65  table-size) time
18de0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18df0 62 69 6e 61 72 79 20 73 65 61 72 63 68 65 73 2e  binary searches.
18e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74  .    */.    cost
18e10 20 3d 20 6e 52 6f 77 20 2b 20 6e 49 6e 4d 75 6c   = nRow + nInMul
18e20 2a 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74  *estLog(aiRowEst
18e30 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  [0]);..    /* Ad
18e40 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20  just the number 
18e50 6f 66 20 72 6f 77 73 20 61 6e 64 20 74 68 65 20  of rows and the 
18e60 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 74 6f  cost downward to
18e70 20 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20   reflect rows.  
18e80 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78    ** that are ex
18e90 63 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20  cluded by range 
18ea0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
18eb0 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28   */.    nRow = (
18ec0 6e 52 6f 77 20 2a 20 28 64 6f 75 62 6c 65 29 65  nRow * (double)e
18ed0 73 74 42 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62  stBound) / (doub
18ee0 6c 65 29 31 30 30 3b 0a 20 20 20 20 63 6f 73 74  le)100;.    cost
18ef0 20 3d 20 28 63 6f 73 74 20 2a 20 28 64 6f 75 62   = (cost * (doub
18f00 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f 20 28  le)estBound) / (
18f10 64 6f 75 62 6c 65 29 31 30 30 3b 0a 0a 20 20 20  double)100;..   
18f20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20 65   /* Add in the e
18f30 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
18f40 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65 73   sorting the res
18f50 75 6c 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ult.    */.    i
18f60 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( bSort ){.    
18f70 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65    cost += cost*e
18f80 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20  stLog(cost);.   
18f90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c   }..    /* If al
18fa0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61  l information ca
18fb0 6e 20 62 65 20 74 61 6b 65 6e 20 64 69 72 65 63  n be taken direc
18fc0 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  tly from the ind
18fd0 65 78 2c 20 77 65 20 61 76 6f 69 64 0a 20 20 20  ex, we avoid.   
18fe0 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20   ** doing table 
18ff0 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 69 73 20 72  lookups.  This r
19000 65 64 75 63 65 73 20 74 68 65 20 63 6f 73 74 20  educes the cost 
19010 62 79 20 68 61 6c 66 2e 20 20 28 4e 6f 74 20 72  by half.  (Not r
19020 65 61 6c 6c 79 20 2d 0a 20 20 20 20 2a 2a 20 74  eally -.    ** t
19030 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
19040 66 69 78 65 64 2e 29 0a 20 20 20 20 2a 2f 0a 20  fixed.).    */. 
19050 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 62     if( pIdx && b
19060 4c 6f 6f 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Lookup==0 ){.   
19070 20 20 20 63 6f 73 74 20 2f 3d 20 28 64 6f 75 62     cost /= (doub
19080 6c 65 29 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  le)2;.    }.    
19090 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20 75 73  /**** Cost of us
190a0 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78 20 68  ing this index h
190b0 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f 6d 70  as now been comp
190c0 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20  uted ****/..    
190d0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
190e0 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74  additional const
190f0 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73 20 74  raints on this t
19100 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  able that cannot
19110 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20  .    ** be used 
19120 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
19130 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68 69 63   index, but whic
19140 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20 74 68  h might lower th
19150 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2a 20  e number.    ** 
19160 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2c 20  of output rows, 
19170 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f 77 20  adjust the nRow 
19180 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e 67 6c  value accordingl
19190 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 0a 20  y.  This only . 
191a0 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20 69 66     ** matters if
191b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
191c0 65 78 20 69 73 20 74 68 65 20 6c 65 61 73 74 20  ex is the least 
191d0 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f  costly, so do no
191e0 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  t bother.    ** 
191f0 77 69 74 68 20 74 68 69 73 20 73 74 65 70 20 69  with this step i
19200 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f  f we already kno
19210 77 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c  w this index wil
19220 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65 6e 2e  l not be chosen.
19230 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65  .    ** Also, ne
19240 76 65 72 20 72 65 64 75 63 65 20 74 68 65 20 6f  ver reduce the o
19250 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20  utput row count 
19260 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20 74 68  below 2 using th
19270 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a 2a 0a  is step..    **.
19280 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63 72 69      ** It is cri
19290 74 69 63 61 6c 20 74 68 61 74 20 74 68 65 20 6e  tical that the n
192a0 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62 65 20  otValid mask be 
192b0 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
192c0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  d of.    ** the 
192d0 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e 20 20  notReady mask.  
192e0 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 61  When computing a
192f0 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e 64 65  n "optimal" inde
19300 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64 79 0a  x, the notReady.
19310 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69 6c 6c      ** mask will
19320 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65 20 62   only have one b
19330 69 74 20 73 65 74 20 2d 20 74 68 65 20 62 69 74  it set - the bit
19340 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
19350 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
19360 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
19370 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  , on the other h
19380 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61 73 20  and, always has 
19390 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66 6f 72  all bits set for
193a0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74  .    ** tables t
193b0 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e 20 6f  hat are not in o
193c0 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49 66 20  uter loops.  If 
193d0 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73 65 64  notReady is used
193e0 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a 20 20   here instead.  
193f0 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c 69 64    ** of notValid
19400 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d 61 6c  , then a optimal
19410 20 69 6e 64 65 78 20 74 68 61 74 20 64 65 70 65   index that depe
19420 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a 6f 69  nds on inner joi
19430 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a 2a 20  ns loops.    ** 
19440 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63 74 65  might be selecte
19450 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  d even when ther
19460 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70 74 69  e exists an opti
19470 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  mal index that h
19480 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73 75 63  as.    ** no suc
19490 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a 20 20  h dependency..  
194a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f    */.    if( nRo
194b0 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70 43 6f  w>2 && cost<=pCo
194c0 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
194d0 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19500 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
19510 69 70 45 71 20 3d 20 6e 45 71 3b 20 20 20 20 20  ipEq = nEq;     
19520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19530 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  of == constraint
19540 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20  s to skip */.   
19550 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61 6e 67     int nSkipRang
19560 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20 20 20  e = nBound;     
19570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c 20 63  /* Number of < c
19580 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b  onstraints to sk
19590 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d  ip */.      Bitm
195a0 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20 20 20  ask thisTab;    
195b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
195c0 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 0a  ap for pSrc */..
195d0 20 20 20 20 20 20 74 68 69 73 54 61 62 20 3d 20        thisTab = 
195e0 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61  getMask(pWC->pMa
195f0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
19600 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57      for(pTerm=pW
19610 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
19620 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20 6b 3b  rm; nRow>2 && k;
19630 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k--, pTerm++){.
19640 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
19650 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
19660 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f 6e 74  M_VIRTUAL ) cont
19670 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
19680 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
19690 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64 29 21  All & notValid)!
196a0 3d 74 68 69 73 54 61 62 20 29 20 63 6f 6e 74 69  =thisTab ) conti
196b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
196c0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
196d0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 4e  r & (WO_EQ|WO_IN
196e0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  |WO_ISNULL) ){. 
196f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 6b           if( nSk
19700 69 70 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  ipEq ){.        
19710 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
19720 65 20 66 69 72 73 74 20 6e 45 71 20 65 71 75 61  e first nEq equa
19730 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73 69 6e  lity matches sin
19740 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ce the index.   
19750 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
19760 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65  already accounte
19770 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20  d for these */. 
19780 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70             nSkip
19790 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  Eq--;.          
197a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
197b0 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61 63     /* Assume eac
197c0 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 71 75  h additional equ
197d0 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65 64 75  ality match redu
197e0 63 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20  ces the result. 
197f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
19800 74 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74  t size by a fact
19810 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20 20 20  or of 10 */.    
19820 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20          nRow /= 
19830 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
19840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
19850 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
19860 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
19870 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29  E|WO_GT|WO_GE) )
19880 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
19890 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a 20 20  nSkipRange ){.  
198a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
198b0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 42  ore the first nB
198c0 6f 75 6e 64 20 72 61 6e 67 65 20 63 6f 6e 73 74  ound range const
198d0 72 61 69 6e 74 73 20 73 69 6e 63 65 20 74 68 65  raints since the
198e0 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
198f0 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
19900 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20  y accounted for 
19910 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  these */.       
19920 20 20 20 20 20 6e 53 6b 69 70 52 61 6e 67 65 2d       nSkipRange-
19930 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  -;.          }el
19940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
19950 2f 2a 20 41 73 73 75 6d 65 20 65 61 63 68 20 61  /* Assume each a
19960 64 64 69 74 69 6f 6e 61 6c 20 72 61 6e 67 65 20  dditional range 
19970 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63  constraint reduc
19980 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  es the result.  
19990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74            ** set
199a0 20 73 69 7a 65 20 62 79 20 61 20 66 61 63 74 6f   size by a facto
199b0 72 20 6f 66 20 33 20 2a 2f 0a 20 20 20 20 20 20  r of 3 */.      
199c0 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b        nRow /= 3;
199d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
199e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
199f0 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
19a00 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  er expression lo
19a10 77 65 72 73 20 74 68 65 20 6f 75 74 70 75 74 20  wers the output 
19a20 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c  row count by hal
19a30 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  f */.          n
19a40 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  Row /= 2;.      
19a50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19a60 20 20 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e    if( nRow<2 ) n
19a70 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a  Row = 2;.    }..
19a80 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
19a90 28 0a 20 20 20 20 20 20 22 25 73 28 25 73 29 3a  (.      "%s(%s):
19aa0 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25   nEq=%d nInMul=%
19ab0 64 20 65 73 74 42 6f 75 6e 64 3d 25 64 20 62 53  d estBound=%d bS
19ac0 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25  ort=%d bLookup=%
19ad0 64 20 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e  d wsFlags=0x%x\n
19ae0 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20  ".      "       
19af0 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c    notReady=0x%ll
19b00 78 20 6e 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74  x nRow=%.2f cost
19b10 3d 25 2e 32 66 20 75 73 65 64 3d 30 78 25 6c 6c  =%.2f used=0x%ll
19b20 78 5c 6e 22 2c 0a 20 20 20 20 20 20 70 53 72 63  x\n",.      pSrc
19b30 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28  ->pTab->zName, (
19b40 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61  pIdx ? pIdx->zNa
19b50 6d 65 20 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20  me : "ipk"), .  
19b60 20 20 20 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c      nEq, nInMul,
19b70 20 65 73 74 42 6f 75 6e 64 2c 20 62 53 6f 72 74   estBound, bSort
19b80 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61  , bLookup, wsFla
19b90 67 73 2c 0a 20 20 20 20 20 20 6e 6f 74 52 65 61  gs,.      notRea
19ba0 64 79 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20  dy, nRow, cost, 
19bb0 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20  used.    ));..  
19bc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
19bd0 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ex is the best w
19be0 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66  e have seen so f
19bf0 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  ar, then record 
19c00 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65  this.    ** inde
19c10 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69  x and its cost i
19c20 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74 72 75  n the pCost stru
19c30 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
19c40 20 20 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20    if( (!pIdx || 
19c50 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20 26 26  wsFlags).     &&
19c60 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43   (cost<pCost->rC
19c70 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43  ost || (cost<=pC
19c80 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52  ost->rCost && nR
19c90 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  ow<pCost->plan.n
19ca0 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  Row)).    ){.   
19cb0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
19cc0 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
19cd0 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64  ost->used = used
19ce0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
19cf0 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  lan.nRow = nRow;
19d00 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
19d10 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28 77 73  an.wsFlags = (ws
19d20 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61 73 6b  Flags&wsFlagMask
19d30 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
19d40 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a  plan.nEq = nEq;.
19d50 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
19d60 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
19d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19d80 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
19d90 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
19da0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
19db0 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
19dc0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
19dd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
19de0 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
19df0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20  ;..    /* Reset 
19e00 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65  masks for the ne
19e10 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  xt index in the 
19e20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c  loop */.    wsFl
19e30 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
19e40 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
19e50 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
19e60 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
19e70 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
19e80 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
19e90 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
19ea0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 53  clause and the S
19eb0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
19ec0 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  er flag.  ** is 
19ed0 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73  set, then revers
19ee0 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74  e the order that
19ef0 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
19f00 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20  be scanned.  ** 
19f10 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  in. This is used
19f20 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   for application
19f30 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c   testing, to hel
19f40 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a  p find cases.  *
19f50 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61 74  * where applicat
19f60 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65  ion behaviour de
19f70 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e  pends on the (un
19f80 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74  defined) order t
19f90 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hat.  ** SQLite 
19fa0 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
19fb0 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  in the absence o
19fc0 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  f an ORDER BY cl
19fd0 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
19fe0 21 70 4f 72 64 65 72 42 79 20 26 26 20 70 50 61  !pOrderBy && pPa
19ff0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1a000 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1a010 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43 6f 73  rder ){.    pCos
1a020 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1a030 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
1a040 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1a050 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 43   pOrderBy || (pC
1a060 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1a070 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
1a080 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1a090 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1a0a0 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74  Idx==0 || (pCost
1a0b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1a0c0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d  HERE_ROWID_EQ)==
1a0d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a0e0 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
1a0f0 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d         || pCost-
1a100 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
1a110 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74  .       || pCost
1a120 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  ->plan.u.pIdx==p
1a130 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29  Src->pIndex .  )
1a140 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
1a150 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a  ("best index is:
1a160 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70   %s\n", .    ((p
1a170 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1a180 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1a190 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e  ULLSCAN)==0 ? "n
1a1a0 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20 20 20  one" : .        
1a1b0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1a1c0 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61  Idx ? pCost->pla
1a1d0 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  n.u.pIdx->zName 
1a1e0 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20  : "ipk").  ));. 
1a1f0 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65   .  bestOrClause
1a200 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1a210 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1a220 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1a230 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20  derBy, pCost);. 
1a240 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
1a250 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1a260 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1a270 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74   pCost);.  pCost
1a280 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
1a290 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a  = eqTermMask;.}.
1a2a0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1a2b0 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
1a2c0 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20 70  ccessing table p
1a2d0 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74 65  Src->pTab. Write
1a2e0 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
1a2f0 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
1a300 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68  cost into the Wh
1a310 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73  ereCost object s
1a320 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74  upplied .** as t
1a330 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  he last paramete
1a340 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1a350 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20 74   may calculate t
1a360 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f  he cost of.** bo
1a370 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72 74  th real and virt
1a380 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ual table scans.
1a390 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a3a0 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
1a3b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a3d0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1a3e0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1a3f0 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
1a400 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1a410 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1a420 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a430 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
1a440 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1a450 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
1a460 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
1a470 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1a480 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20   of cursors not 
1a490 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e  available for in
1a4a0 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d  dexing */.  Bitm
1a4b0 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20  ask notValid,   
1a4c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1a4d0 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rs not available
1a4e0 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65   for any purpose
1a4f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a500 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
1a510 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1a520 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
1a530 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
1a540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
1a550 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
1a560 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  lan */.){.#ifnde
1a570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1a580 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
1a590 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d   IsVirtual(pSrc-
1a5a0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  >pTab) ){.    sq
1a5b0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
1a5c0 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73   *p = 0;.    bes
1a5d0 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
1a5e0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
1a5f0 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61   notReady, notVa
1a600 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  lid, pOrderBy, p
1a610 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20 69 66  Cost,&p);.    if
1a620 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  ( p->needToFreeI
1a630 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73  dxStr ){.      s
1a640 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69  qlite3_free(p->i
1a650 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  dxStr);.    }.  
1a660 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a670 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a  pParse->db, p);.
1a680 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1a690 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65   {.    bestBtree
1a6a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1a6b0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1a6c0 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72  y, notValid, pOr
1a6d0 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20  derBy, pCost);. 
1a6e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61   }.}../*.** Disa
1a6f0 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
1a700 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
1a710 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
1a720 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
1a730 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
1a740 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
1a750 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
1a760 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
1a770 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
1a780 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
1a790 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
1a7a0 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
1a7b0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
1a7c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
1a7d0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
1a7e0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1a7f0 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1a800 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
1a810 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
1a820 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
1a830 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1a840 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1a850 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
1a860 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
1a870 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
1a880 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
1a890 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
1a8a0 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
1a8b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
1a8c0 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
1a8d0 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
1a8e0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
1a8f0 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
1a900 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
1a910 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
1a920 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
1a930 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1a940 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
1a950 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
1a960 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  bled..**.** IMPL
1a970 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1a980 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20  -24597-58655 No 
1a990 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66  tests are done f
1a9a0 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  or terms that ar
1a9b0 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e.** completely 
1a9c0 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
1a9d0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  ices..**.** Disa
1a9e0 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
1a9f0 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
1aa00 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
1aa10 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
1aa20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
1aa30 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
1aa40 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
1aa50 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
1aa60 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
1aa70 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
1aa80 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
1aa90 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
1aaa0 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
1aab0 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
1aac0 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
1aad0 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
1aae0 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
1aaf0 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
1ab00 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
1ab10 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1ab20 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
1ab30 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
1ab40 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
1ab50 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
1ab60 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
1ab70 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
1ab80 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
1ab90 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
1aba0 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
1abb0 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
1abc0 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
1abd0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1abe0 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
1abf0 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
1ac00 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65  rm.      && (pTe
1ac10 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1ac20 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20  RM_CODED)==0.   
1ac30 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69     && (pLevel->i
1ac40 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45  LeftJoin==0 || E
1ac50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ac60 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
1ac70 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a  FromJoin)).  ){.
1ac80 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
1ac90 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
1aca0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
1acb0 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
1acc0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1acd0 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
1ace0 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
1acf0 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
1ad00 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
1ad10 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
1ad20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1ad30 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
1ad40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ad50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
1ad60 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
1ad70 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20  opcode to apply 
1ad80 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
1ad90 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a  ity string zAff.
1ada0 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69  ** to the n regi
1adb0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
1adc0 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41  t base. .**.** A
1add0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
1ade0 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  n, SQLITE_AFF_NO
1adf0 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63  NE entries (whic
1ae00 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74  h are no-ops) at
1ae10 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e   the.** beginnin
1ae20 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66  g and end of zAf
1ae30 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20  f are ignored.  
1ae40 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  If all entries i
1ae50 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51  n zAff are.** SQ
1ae60 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74  LITE_AFF_NONE, t
1ae70 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73  hen no code gets
1ae80 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a   generated..**.*
1ae90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1aea0 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70  akes its own cop
1aeb0 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61  y of zAff so tha
1aec0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  t the caller is 
1aed0 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66  free.** to modif
1aee0 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69  y zAff after thi
1aef0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1af00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1af10 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e  d codeApplyAffin
1af20 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
1af30 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74  e, int base, int
1af40 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b   n, char *zAff){
1af50 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1af60 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
1af70 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zAff==0 ){.   
1af80 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1af90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1afa0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d );.    return;
1afb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76  .  }.  assert( v
1afc0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a  !=0 );..  /* Adj
1afd0 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74  ust base and n t
1afe0 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49  o skip over SQLI
1aff0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72  TE_AFF_NONE entr
1b000 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ies at the begin
1b010 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e  ning.  ** and en
1b020 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74  d of the affinit
1b030 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20  y string..  */. 
1b040 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
1b050 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[0]==SQLITE_A
1b060 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e  FF_NONE ){.    n
1b070 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a  --;.    base++;.
1b080 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a      zAff++;.  }.
1b090 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
1b0a0 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54  zAff[n-1]==SQLIT
1b0b0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1b0c0 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    n--;.  }..  /*
1b0d0 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66   Code the OP_Aff
1b0e0 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20  inity opcode if 
1b0f0 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e  there is anythin
1b100 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f  g left to do. */
1b110 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
1b120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b130 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op2(v, OP_Affini
1b140 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  ty, base, n);.  
1b150 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1b160 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
1b170 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  f, n);.    sqlit
1b180 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1b190 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1b1a0 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
1b1b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1b1c0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
1b1d0 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
1b1e0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1b1f0 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
1b200 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
1b210 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
1b220 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
1b230 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
1b240 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
1b250 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
1b260 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
1b270 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
1b280 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
1b290 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
1b2a0 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
1b2b0 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
1b2c0 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
1b2d0 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
1b2e0 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
1b2f0 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
1b300 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
1b310 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
1b320 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
1b330 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
1b340 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
1b350 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
1b360 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
1b370 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
1b380 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
1b390 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
1b3a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
1b3b0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1b3c0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1b3d0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
1b3e0 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
1b3f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1b400 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b410 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1b420 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
1b430 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
1b440 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
1b450 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
1b460 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
1b470 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
1b480 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
1b490 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1b4a0 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
1b4b0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
1b4c0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b4d0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1b4e0 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1b4f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1b500 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
1b510 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1b520 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69  iTarget>0 );.  i
1b530 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
1b540 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73   ){.    iReg = s
1b550 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1b560 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d  rget(pParse, pX-
1b570 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74  >pRight, iTarget
1b580 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1b590 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  X->op==TK_ISNULL
1b5a0 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   ){.    iReg = i
1b5b0 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69  Target;.    sqli
1b5c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b5d0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65   OP_Null, 0, iRe
1b5e0 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
1b5f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1b610 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
1b620 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
1b630 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
1b640 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
1b650 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
1b660 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
1b670 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c  .    eType = sql
1b680 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1b690 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a  pParse, pX, 0);.
1b6a0 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
1b6b0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
1b6c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b6d0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
1b6e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1b6f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1b700 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
1b710 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  _ABLE );.    if(
1b720 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1b730 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  n==0 ){.      pL
1b740 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
1b750 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b760 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
1b770 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
1b780 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
1b790 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20  l->u.in.aInLoop 
1b7a0 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
1b7b0 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
1b7c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76  pParse->db, pLev
1b7d0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1b7e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75  sizeof(pLevel->u
1b810 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  .in.aInLoop[0])*
1b820 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1b830 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
1b840 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1b850 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
1b860 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
1b870 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20  Level->u.in.nIn 
1b880 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  - 1;.      pIn->
1b890 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20  iCur = iTab;.   
1b8a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
1b8b0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
1b8c0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
1b8d0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
1b8e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b8f0 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52  _Rowid, iTab, iR
1b900 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
1b910 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61  {.        pIn->a
1b920 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74  ddrInTop = sqlit
1b930 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1b940 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
1b950 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20   0, iReg);.     
1b960 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b970 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1b980 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a  _IsNull, iReg);.
1b990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b9a0 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1b9b0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
1b9c0 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
1b9d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
1b9e0 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
1b9f0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
1ba00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1ba10 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
1ba20 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
1ba30 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
1ba40 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ** index..**.** 
1ba50 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
1ba60 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
1ba70 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
1ba80 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
1ba90 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
1baa0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
1bab0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
1bac0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
1bad0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
1bae0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
1baf0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
1bb00 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1bb10 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
1bb20 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
1bb30 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
1bb40 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
1bb50 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
1bb60 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
1bb70 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
1bb80 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1bb90 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
1bba0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
1bbb0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
1bbc0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
1bbd0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
1bbe0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
1bbf0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
1bc00 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
1bc10 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
1bc20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1bc30 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
1bc40 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1bc50 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
1bc60 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
1bc70 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1bc80 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
1bc90 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
1bca0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
1bcb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1bcc0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
1bcd0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
1bce0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
1bcf0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
1bd00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
1bd10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
1bd20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
1bd30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
1bd40 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
1bd50 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
1bd60 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
1bd70 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ll and returns.*
1bd80 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
1bd90 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  hat memory cell.
1bda0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
1bdb0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
1bdc0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
1bdd0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  at memory cell t
1bde0 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
1bdf0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
1be00 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
1be10 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
1be20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
1be30 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
1be40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
1be50 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
1be60 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
1be70 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
1be80 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  l.** use..**.** 
1be90 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
1bea0 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20  , *pzAff is set 
1beb0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
1bec0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1bed0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65  a.** copy of the
1bee0 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
1bef0 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69   string of the i
1bf00 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75  ndex allocated u
1bf10 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44  sing.** sqlite3D
1bf20 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70  bMalloc(). Excep
1bf30 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  t, entries in th
1bf40 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  e copy of the st
1bf50 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a  ring associated.
1bf60 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79  ** with equality
1bf70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
1bf80 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e  t use NONE affin
1bf90 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a  ity are set to.*
1bfa0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
1bfb0 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65  E. This is to de
1bfc0 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68  al with SQL such
1bfd0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
1bfe0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  g:.**.**   CREAT
1bff0 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58  E TABLE t1(a TEX
1c000 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
1c010 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e  );.**   SELECT .
1c020 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32  .. FROM t1 AS t2
1c030 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20  , t1 WHERE t1.a 
1c040 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e  = t2.b;.**.** In
1c050 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1c060 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ve, the index on
1c070 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20   t1(a) has TEXT 
1c080 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69  affinity. But si
1c090 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74  nce.** the right
1c0a0 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68   hand side of th
1c0b0 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
1c0c0 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73  raint (t2.b) has
1c0d0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a   NONE affinity,.
1c0e0 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  ** no conversion
1c0f0 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d   should be attem
1c100 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e  pted before usin
1c110 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61  g a t2.b value a
1c120 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b  s part of.** a k
1c130 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ey to search the
1c140 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68   index. Hence th
1c150 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20  e first byte in 
1c160 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66  the returned aff
1c170 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20  inity.** string 
1c180 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20  in this example 
1c190 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  would be set to 
1c1a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
1c1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1c1c0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
1c1d0 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
1c1e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
1c1f0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1c200 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1c210 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
1c220 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
1c230 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
1c240 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
1c250 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
1c260 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1c270 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
1c280 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
1c290 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
1c2a0 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
1c2b0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
1c2c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
1c2d0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
1c2e0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1c2f0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1c300 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1c310 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
1c320 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
1c330 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
1c340 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
1c350 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
1c360 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20  el->plan.nEq;   
1c370 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1c380 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
1c390 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
1c3a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c3b0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
1c3c0 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
1c3d0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1c3e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
1c410 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
1c420 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  s loop */.  int 
1c430 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  iCur = pLevel->i
1c440 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65  TabCur;   /* The
1c450 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
1c460 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54  able */.  WhereT
1c470 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1c480 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1c490 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  gle constraint t
1c4a0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  erm */.  int j; 
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1c4d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
1c4e0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
1c4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73            /* Bas
1c500 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
1c510 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c530 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
1c540 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
1c550 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
1c560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c570 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1c580 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  string to return
1c590 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   */..  /* This m
1c5a0 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61  odule is only ca
1c5b0 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c  lled on query pl
1c5c0 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  ans that use an 
1c5d0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65  index. */.  asse
1c5e0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
1c5f0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1c600 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49  _INDEXED );.  pI
1c610 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
1c620 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20  n.u.pIdx;..  /* 
1c630 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1c640 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  any memory cells
1c650 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68   we will need th
1c660 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  en allocate them
1c670 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65  ..  */.  regBase
1c680 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1c690 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c  + 1;.  nReg = pL
1c6a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b  evel->plan.nEq +
1c6b0 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
1c6c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1c6d0 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
1c6e0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
1c6f0 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
1c700 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
1c710 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
1c720 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
1c730 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1c740 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1c750 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
1c760 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1c770 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
1c780 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
1c790 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20  Column>=nEq );. 
1c7a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
1c7b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   j++){.    int r
1c7c0 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70  1;.    int k = p
1c7d0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
1c7e0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
1c7f0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1c800 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  , k, notReady, p
1c810 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1c820 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ags, pIdx);.    
1c830 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d  if( NEVER(pTerm=
1c840 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
1c850 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c860 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63  g true for indic
1c870 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e  es with redundan
1c880 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20  t columns. .    
1c890 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e  ** Ex: CREATE IN
1c8a0 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62  DEX i1 ON t1(a,b
1c8b0 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  ,a); SELECT * FR
1c8c0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20  OM t1 WHERE a=0 
1c8d0 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20  AND b=0; */.    
1c8e0 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d  testcase( (pTerm
1c8f0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1c900 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20  _CODED)!=0 );.  
1c910 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1c920 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1c930 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
1c940 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
1c950 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f  2 */.    r1 = co
1c960 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1c970 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1c980 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29  evel, regBase+j)
1c990 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65  ;.    if( r1!=re
1c9a0 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20  gBase+j ){.     
1c9b0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
1c9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1c9d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1c9e0 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a  arse, regBase);.
1c9f0 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
1ca00 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = r1;.      }els
1ca10 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ca20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ca30 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65  OP_SCopy, r1, re
1ca40 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20  gBase+j);.      
1ca50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  }.    }.    test
1ca60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1ca70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
1ca80 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LL );.    testca
1ca90 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
1caa0 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a  ator & WO_IN );.
1cab0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1cac0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1cad0 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d  ISNULL|WO_IN))==
1cae0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
1caf0 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
1cb00 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1cb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cb20 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
1cb30 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
1cb40 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  se+j, pLevel->ad
1cb50 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66  drBrk);.      if
1cb60 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ( zAff ){.      
1cb70 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
1cb80 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
1cb90 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53  ght, zAff[j])==S
1cba0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
1cbb0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
1cbc0 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
1cbd0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1cbe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1cbf0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
1cc00 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
1cc10 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29  ight, zAff[j]) )
1cc20 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  {.          zAff
1cc30 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  [j] = SQLITE_AFF
1cc40 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
1cc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cc60 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41   }.  *pzAff = zA
1cc70 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  ff;.  return reg
1cc80 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Base;.}..#ifndef
1cc90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1cca0 4c 41 49 4e 0a 73 74 61 74 69 63 20 63 68 61 72  LAIN.static char
1ccb0 20 2a 69 6e 64 65 78 52 61 6e 67 65 54 65 78 74   *indexRangeText
1ccc0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
1ccd0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1cce0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
1ccf0 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c    WherePlan *pPl
1cd00 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c  an = &pLevel->pl
1cd10 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  an;.  Index *pIn
1cd20 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70  dex = pPlan->u.p
1cd30 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  Idx;.  int nEq =
1cd40 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 63   pPlan->nEq;.  c
1cd50 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20  har *zRet = 0;. 
1cd60 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69   int i;..  for(i
1cd70 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
1cd80 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
1cd90 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 6e  = pTab->aCol[pIn
1cda0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1cdb0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7a 52 65  ].zName;.    zRe
1cdc0 74 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  t = sqlite3MAppe
1cdd0 6e 64 66 28 64 62 2c 20 7a 52 65 74 2c 20 0a 20  ndf(db, zRet, . 
1cde0 20 20 20 20 20 20 20 22 25 73 25 73 25 73 3d 3f         "%s%s%s=?
1cdf0 22 2c 20 28 7a 52 65 74 3f 7a 52 65 74 3a 22 22  ", (zRet?zRet:""
1ce00 29 2c 20 28 7a 52 65 74 3f 22 20 41 4e 44 20 22  ), (zRet?" AND "
1ce10 3a 22 22 29 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d  :""), zCol);.  }
1ce20 0a 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  ..  if( pPlan->w
1ce30 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d  sFlags&WHERE_BTM
1ce40 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 7a 52  _LIMIT ){.    zR
1ce50 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  et = sqlite3MApp
1ce60 65 6e 64 66 28 64 62 2c 20 7a 52 65 74 2c 0a 20  endf(db, zRet,. 
1ce70 20 20 20 20 20 20 20 22 25 73 25 73 25 73 3e 3f         "%s%s%s>?
1ce80 22 2c 20 28 7a 52 65 74 3f 7a 52 65 74 3a 22 22  ", (zRet?zRet:""
1ce90 29 2c 20 28 7a 52 65 74 3f 22 20 41 4e 44 20 22  ), (zRet?" AND "
1cea0 3a 22 22 29 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  :""), pTab->aCol
1ceb0 5b 6e 45 71 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [nEq].zName);.  
1cec0 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77  }.  if( pPlan->w
1ced0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1cee0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 7a 52  _LIMIT ){.    zR
1cef0 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  et = sqlite3MApp
1cf00 65 6e 64 66 28 64 62 2c 20 7a 52 65 74 2c 0a 20  endf(db, zRet,. 
1cf10 20 20 20 20 20 20 20 22 25 73 25 73 25 73 3c 3f         "%s%s%s<?
1cf20 22 2c 20 28 7a 52 65 74 3f 7a 52 65 74 3a 22 22  ", (zRet?zRet:""
1cf30 29 2c 20 28 7a 52 65 74 3f 22 20 41 4e 44 20 22  ), (zRet?" AND "
1cf40 3a 22 22 29 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  :""), pTab->aCol
1cf50 5b 6e 45 71 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [nEq].zName);.  
1cf60 7d 0a 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  }..  if( zRet ){
1cf70 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69  .    zRet = sqli
1cf80 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1cf90 7a 52 65 74 2c 20 22 20 28 25 73 29 22 2c 20 7a  zRet, " (%s)", z
1cfa0 52 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Ret);.  }..  ret
1cfb0 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn zRet;.}..sta
1cfc0 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 6e 65  tic void codeOne
1cfd0 4c 6f 6f 70 45 78 70 6c 61 69 6e 28 0a 20 20 50  LoopExplain(.  P
1cfe0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d000 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
1d010 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1d020 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
1d030 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
1d040 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
1d050 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
1d060 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1d070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d080 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
1d090 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
1d0a0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
1d0b0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
1d0c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1d0d0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
1d0e0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
1d0f0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 20 20 20 20  .  int iFrom    
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
1d120 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
1d130 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20   output */.){.  
1d140 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
1d150 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33  ain==2 ){.    u3
1d160 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  2 flags = pLevel
1d170 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a  ->plan.wsFlags;.
1d180 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1d190 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1d1a0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
1d1b0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1d1c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d1d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 73  se->pVdbe;.    s
1d1e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d1f0 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61  rse->db;.    cha
1d200 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 20 20 69 66  r *zMsg;..    if
1d210 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ( flags & WHERE_
1d220 4d 55 4c 54 49 5f 4f 52 20 29 20 72 65 74 75 72  MULTI_OR ) retur
1d230 6e 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  n;..    zMsg = s
1d240 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d250 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49  , "TABLE %s", pI
1d260 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1d270 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1d280 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  as ){.      zMsg
1d290 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d2a0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d2b0 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
1d2c0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1d2d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1d2e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
1d2f0 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
1d300 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
1d310 69 6e 64 65 78 52 61 6e 67 65 54 65 78 74 28 64  indexRangeText(d
1d320 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d  b, pLevel, pItem
1d330 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a  ->pTab);.      z
1d340 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d350 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d360 22 25 73 20 57 49 54 48 20 25 73 25 73 49 4e 44  "%s WITH %s%sIND
1d370 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c  EX%s%s%s", zMsg,
1d380 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c   .          ((fl
1d390 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
1d3a0 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54  _INDEX)?"AUTOMAT
1d3b0 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  IC ":""),.      
1d3c0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
1d3d0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43  ERE_IDX_ONLY)?"C
1d3e0 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20  OVERING ":""),. 
1d3f0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1d400 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
1d410 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20  DEX)?"":" "),.  
1d420 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
1d430 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
1d440 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e  EX)?"": pLevel->
1d450 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
1d460 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  me),.          z
1d470 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  Where.      );. 
1d480 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1d490 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a  ee(db, zWhere);.
1d4a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
1d4b0 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
1d4c0 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1d4d0 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
1d4e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1d4f0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1d500 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
1d510 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1d520 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
1d530 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1d540 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
1d550 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d560 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d570 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1d580 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  =?)", zMsg);.   
1d590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1d5a0 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1d5b0 49 54 20 26 26 20 66 6c 61 67 73 26 57 48 45 52  IT && flags&WHER
1d5c0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
1d5d0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
1d5e0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
1d5f0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
1d600 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
1d610 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
1d620 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1d630 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
1d640 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1d650 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1d660 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1d670 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73   (rowid>?)", zMs
1d680 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
1d690 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1d6a0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1d6b0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1d6c0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1d6d0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1d6e0 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
1d6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1d700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1d710 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1d720 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1d730 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
1d740 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
1d750 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1d760 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d  info *pVtabIdx =
1d770 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1d780 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20  pVtabIdx;.      
1d790 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1d7a0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1d7b0 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
1d7c0 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
1d7d0 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
1d7e0 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
1d7f0 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62  x->idxNum, pVtab
1d800 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
1d810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a    }.#endif.    z
1d820 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1d830 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1d840 0a 20 20 20 20 20 20 20 20 22 25 73 20 28 7e 25  .        "%s (~%
1d850 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67  lld rows)", zMsg
1d860 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
1d870 29 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  )(pLevel->plan.n
1d880 52 6f 77 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  Row).    );.    
1d890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8a0 34 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50  4(.        v, OP
1d8b0 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
1d8c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 4c 65  ->iSelectId, iLe
1d8d0 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
1d8e0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1d8f0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
1d900 69 6e 65 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 45  ine codeOneLoopE
1d910 78 70 6c 61 69 6e 28 77 2c 78 2c 79 2e 7a 29 0a  xplain(w,x,y.z).
1d920 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d930 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
1d940 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1d950 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73  e code for the s
1d960 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76  tart of the iLev
1d970 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68  el-th loop in th
1d980 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
1d990 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1d9a0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70 57   described by pW
1d9b0 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
1d9c0 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c  Bitmask codeOneL
1d9d0 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65 72  oopStart(.  Wher
1d9e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
1d9f0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66   /* Complete inf
1da00 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1da10 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1da20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1da30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
1da40 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e  ch level of pWIn
1da50 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62  fo->a[] should b
1da60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36  e coded */.  u16
1da70 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
1da80 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1da90 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
1daa0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
1dab0 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  nt.h */.  Bitmas
1dac0 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f  k notReady     /
1dad0 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20 61  * Which tables a
1dae0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  re currently ava
1daf0 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  ilable */.){.  i
1db00 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt j, k;        
1db10 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1db20 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
1db30 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur;            /
1db40 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1db50 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
1db60 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74  */.  int addrNxt
1db70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
1db80 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f  re to jump to co
1db90 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1dba0 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a  next IN case */.
1dbb0 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
1dbc0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1dbd0 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
1dbe0 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ex only */.  int
1dbf0 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
1dc00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
1dc10 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
1dc20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
1dc30 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1dc40 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77  Level;  /* The w
1dc50 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65  here level to be
1dc60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
1dc70 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1dc80 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
1dc90 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
1dca0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1dcb0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1dcc0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1dcd0 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61    /* A WHERE cla
1dce0 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61  use term */.  Pa
1dcf0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd10 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1dd20 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
1dd50 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
1dd60 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
1dd70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1dd80 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
1dd90 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
1dda0 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
1ddb0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
1ddc0 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
1ddd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1dde0 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
1ddf0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
1de00 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
1de10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1de30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1de40 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
1de50 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
1de60 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
1de70 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
1de80 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
1de90 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
1dea0 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
1deb0 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
1dec0 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
1ded0 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
1dee0 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
1def0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1df00 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
1df10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
1df20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20  = pWInfo->pWC;. 
1df30 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
1df40 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  o->a[iLevel];.  
1df50 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e  pTabItem = &pWIn
1df60 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
1df70 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1df80 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
1df90 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52  m->iCursor;.  bR
1dfa0 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ev = (pLevel->pl
1dfb0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1dfc0 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
1dfd0 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70    omitTable = (p
1dfe0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1dff0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
1e000 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20  ONLY)!=0 .      
1e010 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
1e020 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43  ags & WHERE_FORC
1e030 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20  E_TABLE)==0;..  
1e040 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
1e050 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22   for the "break"
1e060 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20   and "continue" 
1e070 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a  instructions.  *
1e080 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
1e090 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
1e0a0 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61   addrBrk to brea
1e0b0 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e  k out of a loop.
1e0c0 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f  .  ** Jump to co
1e0d0 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61  nt to go immedia
1e0e0 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74  tely to the next
1e0f0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1e100 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a  e.  ** loop..  *
1e110 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72  *.  ** When ther
1e120 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
1e130 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
1e140 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61  e a "addrNxt" la
1e150 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65  bel that.  ** me
1e160 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
1e170 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
1e180 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
1e190 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74  on.  When.  ** t
1e1a0 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
1e1b0 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
1e1c0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1e1d0 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
1e1e0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  .  ** is the sam
1e1f0 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a  e as "addrBrk"..
1e200 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d    */.  addrBrk =
1e210 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1e220 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1e230 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1e240 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e250 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65  addrCont = pLeve
1e260 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  l->addrCont = sq
1e270 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1e280 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  el(v);..  /* If 
1e290 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
1e2a0 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
1e2b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
1e2c0 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20  locate and.  ** 
1e2d0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
1e2e0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
1e2f0 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
1e300 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
1e310 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
1e320 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68  left table of th
1e330 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  e join..  */.  i
1e340 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  f( pLevel->iFrom
1e350 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b  >0 && (pTabItem[
1e360 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  0].jointype & JT
1e370 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20  _LEFT)!=0 ){.   
1e380 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1e390 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  in = ++pParse->n
1e3a0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1e3b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e3c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65  _Integer, 0, pLe
1e3d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1e3e0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1e3f0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
1e400 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
1e410 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ag"));.  }..#ifn
1e420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e430 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1e440 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  f(  (pLevel->pla
1e450 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e460 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
1e470 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  =0 ){.    /* Cas
1e480 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
1e490 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
1e4a0 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
1e4b0 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
1e4c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74     **          t
1e4d0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
1e4e0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  a..    */.    in
1e4f0 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20  t iReg;   /* P3 
1e500 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69  Value for OP_VFi
1e510 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lter */.    sqli
1e520 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1e530 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
1e540 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
1e550 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e  dx;.    int nCon
1e560 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49  straint = pVtabI
1e570 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
1e580 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69  .    struct sqli
1e590 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1e5a0 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61  aint_usage *aUsa
1e5b0 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
1e5f0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
1e600 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .    const struc
1e610 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1e620 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  constraint *aCon
1e630 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20  straint =.      
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
1e670 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->aConstraint;
1e680 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
1e690 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e6a0 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 73  e);.    iReg = s
1e6b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1e6c0 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73  ge(pParse, nCons
1e6d0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66  traint+2);.    f
1e6e0 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
1e6f0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1e700 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
1e710 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
1e720 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
1e730 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65  sage[k].argvInde
1e740 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  x==j ){.        
1e750 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
1e760 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
1e770 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1e780 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e790 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d  ode(pParse, pWC-
1e7a0 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d  >a[iTerm].pExpr-
1e7b0 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b  >pRight, iReg+j+
1e7c0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
1e7d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1e7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e7f0 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20   k==nConstraint 
1e800 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1e810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e820 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e830 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  er, pVtabIdx->id
1e840 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20  xNum, iReg);.   
1e850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e860 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e870 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a  , j-1, iReg+1);.
1e880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e890 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c  ddOp4(v, OP_VFil
1e8a0 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ter, iCur, addrB
1e8b0 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49  rk, iReg, pVtabI
1e8c0 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20  dx->idxStr,.    
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64    pVtabIdx->need
1e8f0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50  ToFreeIdxStr ? P
1e900 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53  4_MPRINTF : P4_S
1e910 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61  TATIC);.    pVta
1e920 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
1e930 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
1e940 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73  for(j=0; j<nCons
1e950 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
1e960 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
1e970 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
1e980 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
1e990 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
1e9a0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
1e9b0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1e9c0 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54  evel, &pWC->a[iT
1e9d0 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erm]);.      }. 
1e9e0 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1e9f0 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a  >op = OP_VNext;.
1ea00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1ea10 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1ea20 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
1ea30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ea40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1ea50 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1ea60 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f  Parse, iReg, nCo
1ea70 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20  nstraint+2);.   
1ea80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ea90 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
1eaa0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1eab0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
1eac0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
1ead0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1eae0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1eaf0 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
1eb00 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57     /* Case 1:  W
1eb10 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72  e can directly r
1eb20 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
1eb30 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20  e row using an. 
1eb40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65     **          e
1eb50 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1eb60 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1eb70 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a  OWID field.  Or.
1eb80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1eb90 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
1eba0 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
1ebb0 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
1ebc0 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  .)".    **      
1ebd0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
1ebe0 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61     */.    iRelea
1ebf0 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1ec00 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1ec10 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  );.    pTerm = f
1ec20 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1ec30 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
1ec40 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
1ec50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1ec60 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1ec70 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1ec80 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1ec90 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74  ert( pTerm->left
1eca0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1ecb0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1ecc0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1ecd0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1ece0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1ecf0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
1ed00 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
1ed10 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  */.    iRowidReg
1ed20 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1ed30 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1ed40 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65  m, pLevel, iRele
1ed50 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64 64  aseReg);.    add
1ed60 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rNxt = pLevel->a
1ed70 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69  ddrNxt;.    sqli
1ed80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ed90 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
1eda0 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e 78  RowidReg, addrNx
1edb0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1edc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1edd0 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c  NotExists, iCur,
1ede0 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69 64   addrNxt, iRowid
1edf0 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1ee00 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1ee10 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1ee20 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1ee30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ee40 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c  , "pk"));.    pL
1ee50 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
1ee60 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  op;.  }else if( 
1ee70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1ee80 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
1ee90 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  ID_RANGE ){.    
1eea0 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
1eeb0 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
1eec0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
1eed0 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
1eee0 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ield..    */.   
1eef0 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
1ef00 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73  _Noop;.    int s
1ef10 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65  tart;.    int me
1ef20 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20  mEndValue = 0;. 
1ef30 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
1ef40 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
1ef50 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
1ef60 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53  ble==0 );.    pS
1ef70 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
1ef80 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
1ef90 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
1efa0 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70 45  O_GE, 0);.    pE
1efb0 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
1efc0 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
1efd0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
1efe0 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  LE, 0);.    if( 
1eff0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
1f000 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
1f010 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1f020 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
1f030 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
1f040 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1f050 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1f060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
1f080 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
1f090 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
1f0a0 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
1f0b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
1f0c0 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
1f0d0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
1f0e0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
1f0f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1f100 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
1f110 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
1f120 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
1f130 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
1f140 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
1f150 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1f160 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
1f170 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
1f180 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
1f190 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
1f1a0 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
1f1b0 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
1f1c0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
1f1d0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
1f1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1f1f0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
1f200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1f210 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
1f220 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
1f230 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1f240 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
1f250 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1f260 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
1f270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f280 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
1f290 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
1f2a0 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
1f2b0 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
1f2c0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1f2d0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
1f2e0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
1f2f0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  . */..      test
1f300 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1f310 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f320 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1f330 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1f340 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
1f350 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
1f360 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1f370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f380 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f  Start->leftCurso
1f390 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
1f3a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f3b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f3c0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72  , pX->pRight, &r
1f3d0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
1f3e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f3f0 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70  , aMoveOp[pX->op
1f400 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61  -TK_GT], iCur, a
1f410 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  ddrBrk, r1);.   
1f420 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1f430 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
1f440 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f450 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1f460 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a  pParse, r1, 1);.
1f470 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1f480 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1f490 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20 20  se, rTemp);.    
1f4a0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f4b0 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
1f4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f4d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f4e0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
1f4f0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
1f500 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1f510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f520 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1f530 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58 20  r *pX;.      pX 
1f540 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
1f550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1f560 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1f570 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75  rt( pEnd->leftCu
1f580 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
1f590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1f5a0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
1f5b0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
1f5c0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
1f5d0 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45  62 */.      memE
1f5e0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1f5f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1f600 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f610 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1f620 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1f630 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1f640 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1f650 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1f660 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1f670 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1f680 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1f690 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1f6a0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1f6b0 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1f6c0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f6d0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1f6e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1f6f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f700 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f710 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f720 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1f730 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1f740 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1f750 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f760 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66 28  = start;.    if(
1f770 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70 45   pStart==0 && pE
1f780 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nd==0 ){.      p
1f790 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49  Level->p5 = SQLI
1f7a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
1f7b0 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20  LLSCAN_STEP;.   
1f7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1f7d0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35  sert( pLevel->p5
1f7e0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
1f7f0 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
1f800 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69 52  Noop ){.      iR
1f810 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61  owidReg = iRelea
1f820 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1f830 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1f840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f850 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f860 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1f870 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f880 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f890 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1f8a0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1f8b0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f8c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1f8d0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1f8e0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1f8f0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1f900 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f910 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1f920 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1f930 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f940 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1f950 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1f960 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
1f970 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
1f980 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a  E_COLUMN_EQ) ){.
1f990 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41      /* Case 3: A
1f9a0 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69   scan using an i
1f9b0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
1f9c0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
1f9d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79  WHERE clause may
1f9e0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72   contain zero or
1f9f0 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a   more equality .
1fa00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1fa10 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49  erms ("==" or "I
1fa20 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68  N" operators) th
1fa30 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1fa40 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  N.    **        
1fa50 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
1fa60 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
1fa70 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
1fa80 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tain.    **     
1fa90 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63      inequality c
1faa0 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c  onstraints (>, <
1fab0 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74  , >= or <=) on t
1fac0 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a  he indexed.    *
1fad0 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
1fae0 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c   that immediatel
1faf0 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20  y follows the N 
1fb00 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79  equalities. Only
1fb10 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1fb20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1fb30 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
1fb40 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
1fb50 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
1fb60 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
1fb70 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22  he "==" and "IN"
1fb80 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20   operators. For 
1fb90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1fba0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fbb0 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79  index is on (x,y
1fbc0 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  ,z), then the fo
1fbd0 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20  llowing clauses 
1fbe0 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  are all .    ** 
1fbf0 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65          optimize
1fc00 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
1fc20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1fc30 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20    x=5 AND y=10. 
1fc40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1fc50 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   x=5 AND y<10.  
1fc60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1fc70 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20  x=5 AND y>5 AND 
1fc80 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
1fc90 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1fca0 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20  =5 AND z<=10.   
1fcb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1fcc0 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d     The z<10 term
1fcd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1fce0 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  g cannot be used
1fcf0 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  , only.    **   
1fd00 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65        the x=5 te
1fd10 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rm:.    **.    *
1fd20 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1fd30 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a   AND z<10.    **
1fd40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1fd50 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66  N may be zero if
1fd60 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
1fd70 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1fd80 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s..    **       
1fd90 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
1fda0 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  o inequality con
1fdb0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e  straints, then N
1fdc0 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20   is at.    **   
1fdd0 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e        least one.
1fde0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fdf0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
1fe00 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
1fe10 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
1fe20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1fe30 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
1fe40 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
1fe50 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
1fe60 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
1fe70 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1fe80 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
1fe90 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
1fea0 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
1feb0 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20  R BY..    */  . 
1fec0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1fed0 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  u8 aStartOp[] = 
1fee0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1fef0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1ff00 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1ff10 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1ff20 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1ff30 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1ff40 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff60 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1ff70 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1ff80 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1ff90 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
1ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1ffb0 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1ffc0 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1ffd0 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1ffe0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
1fff0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
20000 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
20010 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
20020 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
20030 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
20040 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
20050 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
20060 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
20070 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
20080 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
20090 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
200a0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
200b0 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
200c0 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
200d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
200e0 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a  u8 aEndOp[] = {.
200f0 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20        OP_Noop,  
20100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
20110 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e   (!end_constrain
20120 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ts) */.      OP_
20130 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20  IdxGE,          
20140 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e    /* 1: (end_con
20150 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65  straints && !bRe
20160 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49  v) */.      OP_I
20170 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  dxLT            
20180 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 2: (end_cons
20190 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29  traints && bRev)
201a0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
201b0 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
201c0 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e  >plan.nEq;  /* N
201d0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
201e0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
201f0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
20200 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
20210 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
20220 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
20230 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  n(x).. */.    in
20240 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
20250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
20260 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
20270 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
20280 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  alues */.    int
20290 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
202a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
202b0 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  p register */.  
202c0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
202d0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
202e0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
202f0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
20300 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57 68   start */.    Wh
20310 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 45  ereTerm *pRangeE
20320 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e  nd = 0;    /* In
20330 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20340 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e 64  int at range end
20350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72   */.    int star
20360 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  tEq;            
20370 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20380 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65 73  range start uses
20390 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
203a0 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b 20  .    int endEq; 
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
203d0 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20  ge end uses ==, 
203e0 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
203f0 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72  int start_constr
20400 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20  aints;       /* 
20410 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69  Start of range i
20420 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f  s constrained */
20430 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
20440 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  aint;           
20450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
20460 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
20470 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
20480 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
20490 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
204a0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
204b0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  g */.    int iId
204c0 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
204d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
204e0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
204f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
20500 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30 3b  t nExtraReg = 0;
20510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20520 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
20530 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20 2a  gisters needed *
20540 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20  /.    int op;   
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
20570 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  n opcode */.    
20580 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66 3b  char *zStartAff;
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205a0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74 61  Affinity for sta
205b0 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  rt of range cons
205c0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68  traint */.    ch
205d0 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20  ar *zEndAff;    
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
205f0 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20 6f  finity for end o
20600 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  f range constrai
20610 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20  nt */..    pIdx 
20620 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
20630 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  .pIdx;.    iIdxC
20640 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
20650 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49  xCur;.    k = pI
20660 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
20670 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ];     /* Column
20680 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20   for inequality 
20690 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a  constraints */..
206a0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
206b0 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
206c0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
206d0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
206e0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
206f0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
20700 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
20710 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
20720 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
20730 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
20740 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
20750 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
20760 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
20770 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
20780 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
20790 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
207a0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
207b0 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
207c0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
207d0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
207e0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
207f0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
20800 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
20810 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
20820 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
20830 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
20840 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
20850 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
20860 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
20870 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 26  if( (wctrlFlags&
20880 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
20890 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  N)!=0.     && (p
208a0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
208b0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
208c0 59 29 0a 20 20 20 20 20 26 26 20 28 70 49 64 78  Y).     && (pIdx
208d0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
208e0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61     ){.      /* a
208f0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d  ssert( pOrderBy-
20900 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a  >nExpr==1 ); */.
20910 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
20920 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
20930 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
20940 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
20950 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  Eq] ); */.      
20960 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
20970 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
20980 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
20990 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65 71  /* Find any ineq
209a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
209b0 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
209c0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a 20  start and end . 
209d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e     ** of the ran
209e0 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ge. .    */.    
209f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
20a00 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20a10 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _TOP_LIMIT ){.  
20a20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20      pRangeEnd = 
20a30 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
20a40 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
20a50 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20   (WO_LT|WO_LE), 
20a60 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
20a70 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
20a80 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
20a90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
20aa0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
20ab0 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65   ){.      pRange
20ac0 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
20ad0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
20ae0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c  otReady, (WO_GT|
20af0 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_GE), pIdx);. 
20b00 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
20b10 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
20b20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20b30 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
20b40 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
20b50 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
20b60 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
20b70 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
20b80 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
20b90 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
20ba0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
20bb0 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
20bc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
20bd0 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
20be0 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20 20  lityTerms(.     
20bf0 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76 65     pParse, pLeve
20c00 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64 79  l, pWC, notReady
20c10 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a 53  , nExtraReg, &zS
20c20 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a 20  tartAff.    );. 
20c30 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c     zEndAff = sql
20c40 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
20c50 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41  rse->db, zStartA
20c60 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  ff);.    addrNxt
20c70 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
20c80 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  xt;..    /* If w
20c90 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65  e are doing a re
20ca0 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e  verse order scan
20cb0 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
20cc0 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a   index, or.    *
20cd0 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65  * a forward orde
20ce0 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63  r scan on a desc
20cf0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e  ending index, in
20d00 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20  terchange the . 
20d10 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
20d20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
20d30 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
20d40 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  eEnd)..    */.  
20d50 20 20 69 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e    if( nEq<pIdx->
20d60 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d  nColumn && bRev=
20d70 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  =(pIdx->aSortOrd
20d80 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
20d90 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20  SO_ASC) ){.     
20da0 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 20   SWAP(WhereTerm 
20db0 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70 52  *, pRangeEnd, pR
20dc0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
20dd0 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  }..    testcase(
20de0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
20df0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
20e00 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
20e10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20e20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
20e30 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
20e40 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
20e50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
20e60 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
20e70 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20e80 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
20e90 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20ea0 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
20eb0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20ec0 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72 74  _GE );.    start
20ed0 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
20ee0 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
20ef0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
20f00 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
20f10 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
20f20 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
20f30 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20f40 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
20f50 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
20f60 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
20f70 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
20f80 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
20f90 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
20fa0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
20fb0 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
20fc0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
20fd0 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
20fe0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
20ff0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
21000 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
21010 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
21020 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21030 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
21040 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
21050 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21060 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
21070 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
21080 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  Eq, addrNxt);.  
21090 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66      if( zStartAf
210a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
210b0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
210c0 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
210d0 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d  zStartAff[nEq])=
210e0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
210f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21100 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
21110 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
21120 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
21130 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
21140 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
21150 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
21160 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
21170 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
21180 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
21190 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
211a0 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
211b0 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b        zStartAff[
211c0 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
211d0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
211e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
211f0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
21200 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21210 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
21220 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20  [nEq]) ){.      
21230 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
21240 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
21250 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
21260 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
21270 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
21280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21290 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
212a0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
212b0 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
212c0 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
212d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
212e0 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
212f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21300 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21310 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
21320 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
21330 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
21340 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
21350 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
21360 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
21370 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
21380 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
21390 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53   nConstraint, zS
213a0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70  tartAff);.    op
213b0 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
213c0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
213d0 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
213e0 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
213f0 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
21400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21410 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
21420 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21430 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
21440 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21450 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
21460 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
21470 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
21480 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
21490 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
214a0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
214b0 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
214c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
214d0 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
214e0 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
214f0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  e, nConstraint);
21500 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
21510 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
21520 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
21530 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
21540 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   of the.    ** r
21550 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20  ange (if any).. 
21560 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74     */.    nConst
21570 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
21580 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
21590 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
215a0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64  ight = pRangeEnd
215b0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
215c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
215d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
215e0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45  arse, regBase+nE
215f0 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  q, 1);.      sql
21600 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21610 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67  rse, pRight, reg
21620 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
21630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21640 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
21650 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
21660 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
21670 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29     if( zEndAff )
21680 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
21690 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
216a0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e  nity(pRight, zEn
216b0 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  dAff[nEq])==SQLI
216c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
216d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
216e0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
216f0 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
21700 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
21710 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
21720 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
21730 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
21740 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
21750 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
21760 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
21770 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
21780 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
21790 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20   zEndAff[nEq] = 
217a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
217b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
217c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
217d0 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
217e0 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
217f0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b  zEndAff[nEq]) ){
21800 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41  .          zEndA
21810 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
21820 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
21830 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
21840 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
21850 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
21860 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
21870 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  EndAff);.      n
21880 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
21890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
218a0 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73  angeEnd->wtFlags
218b0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
218c0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
218d0 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d  5-11662 */.    }
218e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
218f0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
21900 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73  StartAff);.    s
21910 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
21920 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66  rse->db, zEndAff
21930 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f  );..    /* Top o
21940 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20  f the loop body 
21950 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  */.    pLevel->p
21960 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
21970 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
21980 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21990 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
219a0 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
219b0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
219c0 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f  /.    op = aEndO
219d0 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
219e0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
219f0 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  )];.    testcase
21a00 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b  ( op==OP_Noop );
21a10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
21a20 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20  p==OP_IdxGE );. 
21a30 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21a40 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
21a50 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70   if( op!=OP_Noop
21a60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21a70 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
21a80 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
21a90 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
21aa0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20   nConstraint);. 
21ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21ac0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
21ad0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
21ae0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
21af0 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
21b00 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
21b10 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
21b20 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
21b30 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
21b40 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
21b50 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
21b60 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
21b70 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
21b80 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
21b90 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
21ba0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
21bb0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
21bc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
21bd0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21be0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
21bf0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
21c00 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
21c10 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
21c20 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
21c30 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
21c40 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
21c50 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
21c60 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
21c70 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
21c80 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
21c90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21ca0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
21cb0 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
21cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
21ce0 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
21cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21d00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21d10 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
21d20 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
21d30 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
21d40 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
21d50 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
21d60 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
21d70 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
21d80 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
21d90 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
21da0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
21db0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
21dc0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
21dd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
21de0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
21df0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21e00 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
21e10 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
21e20 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
21e30 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
21e40 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
21e50 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
21e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21e70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
21e80 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
21e90 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
21ea0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
21eb0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
21ec0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
21ed0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
21ee0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
21ef0 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
21f00 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
21f10 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
21f20 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
21f30 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
21f40 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
21f50 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
21f60 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
21f70 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
21f80 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  r;.  }else..#ifn
21f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21fa0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
21fb0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
21fc0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
21fd0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
21fe0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
21ff0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
22000 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
22010 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
22020 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
22030 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
22040 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
22050 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
22060 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
22070 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
22080 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
22090 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
220a0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
220b0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
220c0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
220d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
220e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
220f0 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
22100 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
22110 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
22120 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
22130 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
22140 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
22150 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
22160 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
22170 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
22180 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
22190 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
221a0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
221c0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
221d0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
221e0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
221f0 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
22200 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
22210 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
22220 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
22230 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
22240 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
22250 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
22260 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
22270 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
22280 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
22290 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
222a0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
222b0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
222c0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
222d0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
222e0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
222f0 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
22300 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22310 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
22320 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
22330 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
22340 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
22350 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
22360 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
22370 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
22380 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
22390 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
223a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
223b0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
223c0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
223d0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
223e0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
223f0 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
22400 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
22410 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
22420 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
22430 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
22440 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
22450 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22460 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
22470 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
22480 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
22490 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
224a0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
224b0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
224c0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
224d0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
224e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
224f0 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
22500 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
22510 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
22520 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
22530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
22540 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
22550 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
22560 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
22570 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
22580 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
22590 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
225a0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
225b0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
225c0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
225d0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
225e0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
225f0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  erms */.    Wher
22600 65 54 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20 20  eTerm *pFinal;  
22610 20 20 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62 74     /* Final subt
22620 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f  erm within the O
22630 52 2d 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  R-clause. */.   
22640 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62   SrcList *pOrTab
22650 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74  ;       /* Short
22660 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
22670 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e  or OR-clause gen
22680 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  eration */..    
22690 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
226a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
226b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
226c0 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
226d0 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
226e0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
226f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
22710 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
22720 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
22730 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22760 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
22770 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
22780 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
22790 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
227a0 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
227b0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
227c0 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
227f0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
22800 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
22810 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
22820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22830 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
22840 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
22850 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
22860 20 69 69 3b 0a 20 20 20 0a 20 20 20 20 70 54 65   ii;.   .    pTe
22870 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  rm = pLevel->pla
22880 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61  n.u.pTerm;.    a
22890 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
228a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
228b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
228c0 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73  =WO_OR );.    as
228d0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
228e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
228f0 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  NFO)!=0 );.    p
22900 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWc = &pTerm->u
22910 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
22920 20 20 70 46 69 6e 61 6c 20 3d 20 26 70 4f 72 57    pFinal = &pOrW
22930 63 2d 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54 65 72  c->a[pOrWc->nTer
22940 6d 2d 31 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  m-1];.    pLevel
22950 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e  ->op = OP_Return
22960 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
22970 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20   = regReturn;.. 
22980 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e     /* Set up a n
22990 65 77 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f  ew SrcList ni pO
229a0 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rTab containing 
229b0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
229c0 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62  scanned.    ** b
229d0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74  y this loop in t
229e0 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64  he a[0] slot and
229f0 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61   all notReady ta
22a00 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73  bles in a[1..] s
22a10 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69  lots..    ** Thi
22a20 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72  s becomes the Sr
22a30 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63  cList in the rec
22a40 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73  ursive call to s
22a50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22a60 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ()..    */.    i
22a70 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
22a80 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l>1 ){.      int
22a90 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20   nNotReady;     
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74  he number of not
22ac0 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a  Ready tables */.
22ad0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
22ae0 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53  List_item *origS
22af0 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  rc;     /* Origi
22b00 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  nal list of tabl
22b10 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74  es */.      nNot
22b20 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e  Ready = pWInfo->
22b30 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20  nLevel - iLevel 
22b40 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  - 1;.      pOrTa
22b50 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  b = sqlite3Stack
22b60 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d  AllocRaw(pParse-
22b70 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b90 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29   sizeof(*pOrTab)
22ba0 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65  + nNotReady*size
22bb0 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29  of(pOrTab->a[0])
22bc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
22bd0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
22be0 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20  notReady;.      
22bf0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d  pOrTab->nAlloc =
22c00 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79   (i16)(nNotReady
22c10 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72   + 1);.      pOr
22c20 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54  Tab->nSrc = pOrT
22c30 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ab->nAlloc;.    
22c40 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d    memcpy(pOrTab-
22c50 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69  >a, pTabItem, si
22c60 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29  zeof(*pTabItem))
22c70 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20  ;.      origSrc 
22c80 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
22c90 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  st->a;.      for
22ca0 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61  (k=1; k<=nNotRea
22cb0 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  dy; k++){.      
22cc0 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62    memcpy(&pOrTab
22cd0 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63  ->a[k], &origSrc
22ce0 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d  [pLevel[k].iFrom
22cf0 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  ], sizeof(pOrTab
22d00 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[k]));.      
22d10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22d20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e     pOrTab = pWIn
22d30 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
22d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74    }..    /* Init
22d50 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65  ialize the rowse
22d60 74 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f  t register to co
22d70 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53  ntain NULL. An S
22d80 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20  QL NULL is .    
22d90 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
22da0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
22db0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22dc0 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  Also initialize 
22dd0 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e  regReturn to con
22de0 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73  tain the address
22df0 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74   of the instruct
22e00 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65  ion .    ** imme
22e10 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
22e20 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20  g the OP_Return 
22e30 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
22e40 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a   the loop. This.
22e50 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
22e60 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63  ed in a few obsc
22e70 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  ure LEFT JOIN ca
22e80 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f  ses where contro
22e90 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f  l jumps.    ** o
22ea0 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ver the top of t
22eb0 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65  he loop into the
22ec0 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20   body of it. In 
22ed0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20  this case the . 
22ee0 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65     ** correct re
22ef0 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65  sponse for the e
22f00 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20  nd-of-loop code 
22f10 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20  (the OP_Return) 
22f20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61  is to .    ** fa
22f30 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
22f40 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
22f50 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f  on, just as an O
22f60 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20  P_Next does if. 
22f70 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20     ** called on 
22f80 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  an uninitialized
22f90 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a   cursor..    */.
22fa0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
22fb0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
22fc0 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
22fd0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74  .      regRowset
22fe0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22ff0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
23000 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
23010 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
23020 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23030 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
23040 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wset);.    }.   
23050 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69   iRetInit = sqli
23060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23070 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
23080 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20  regReturn);..   
23090 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f   for(ii=0; ii<pO
230a0 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  rWc->nTerm; ii++
230b0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
230c0 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70  rm *pOrTerm = &p
230d0 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20  OrWc->a[ii];.   
230e0 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
230f0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
23100 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70   || pOrTerm->eOp
23110 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
23120 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
23130 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
23140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
23150 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
23160 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
23170 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
23180 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
23190 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
231a0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
231b0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
231c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
231d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
231e0 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ab, pOrTerm->pEx
231f0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
23210 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c  HERE_OMIT_OPEN |
23220 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53   WHERE_OMIT_CLOS
23230 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
23240 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
23250 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
23260 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
23270 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66  NLY);.        if
23280 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
23290 20 20 20 20 20 20 20 20 20 63 6f 64 65 4f 6e 65           codeOne
232a0 4c 6f 6f 70 45 78 70 6c 61 69 6e 28 0a 20 20 20  LoopExplain(.   
232b0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
232c0 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  e, pOrTab, &pSub
232d0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65  WInfo->a[0], iLe
232e0 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  vel, pLevel->iFr
232f0 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  om.          );.
23300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
23310 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
23320 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
23330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23340 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
23350 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
23360 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
23370 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
23380 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
23390 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
233a0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
233b0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
233c0 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b 0a 20      regRowid);. 
23400 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23410 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
23420 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
23430 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23460 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23470 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
23480 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
23490 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
234a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
234b0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
234c0 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
234d0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
234e0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
234f0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
23500 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
23510 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
23520 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
23530 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
23540 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
23550 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
23560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
23570 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
23580 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
23590 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
235a0 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
235b0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
235c0 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
235d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
235e0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
235f0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
23600 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
23610 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
23620 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
23630 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
23640 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
23650 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
23660 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
23670 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
23680 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
23690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
236a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
236b0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
236c0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
236d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
236e0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
236f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23700 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
23710 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
23720 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23730 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
23740 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
23750 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
23760 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
23770 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  kFree(pParse->db
23780 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
23790 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
237a0 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
237b0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
237c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
237d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
237e0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
237f0 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
23800 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
23810 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
23820 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
23830 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
23840 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
23850 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
23860 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
23870 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
23880 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
23890 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
238a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
238b0 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
238c0 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
238d0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
238e0 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
238f0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
23900 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
23910 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
23920 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
23930 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
23940 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
23950 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
23960 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23970 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
23980 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
23990 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
239a0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
239b0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
239c0 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
239d0 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
239e0 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
239f0 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
23a00 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
23a10 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
23a20 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
23a30 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
23a40 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
23a50 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
23a60 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  les..  **.  ** I
23a70 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
23a80 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20  : R-49525-50935 
23a90 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f  Terms that canno
23aa0 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74  t be satisfied t
23ab0 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
23ac0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62  use of indices b
23ad0 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74  ecome tests that
23ae0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
23af0 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20  gainst each row 
23b00 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65  of.  ** the rele
23b10 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65  vant input table
23b20 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 30 3b  s..  */.  k = 0;
23b30 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
23b40 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
23b50 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
23b60 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
23b70 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73  *pE;.    testcas
23b80 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
23b90 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
23ba0 20 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30   ); /* IMP: R-30
23bb0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
23bc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23bd0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
23be0 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69 66  _CODED );.    if
23bf0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
23c00 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
23c10 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
23c20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
23c30 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
23c40 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
23c50 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
23c60 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ase( pWInfo->unt
23c70 65 73 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20  estedTerms==0.  
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23c90 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
23ca0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
23cb0 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b  ABLE_ONLY)!=0 );
23cc0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75  .      pWInfo->u
23cd0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
23ce0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
23cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d  ;.    }.    pE =
23d00 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
23d10 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
23d20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
23d30 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
23d40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23d50 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
23d60 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  n) ){.      cont
23d70 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
23d80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23d90 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 61  se(pParse, pE, a
23da0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
23db0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
23dc0 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70 54 65 72   k = 1;.    pTer
23dd0 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
23de0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
23df0 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
23e00 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
23e10 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
23e20 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
23e30 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
23e40 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
23e50 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
23e60 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
23e70 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
23e80 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
23e90 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
23ea0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
23eb0 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
23ec0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
23ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23ee0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
23ef0 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
23f00 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
23f10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23f20 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
23f30 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
23f40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23f50 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
23f60 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
23f70 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
23f80 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
23f90 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
23fa0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
23fb0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
23fc0 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
23fd0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
23fe0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
23ff0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
24000 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
24010 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
24020 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24030 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
24040 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
24050 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
24060 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
24070 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
24080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24090 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
240a0 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
240b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
240c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
240d0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
240e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
240f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
24100 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
24110 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
24120 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
24130 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
24140 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
24150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
24160 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24170 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
24180 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
24190 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  urn notReady;.}.
241a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
241b0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
241c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
241d0 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
241e0 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
241f0 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
24200 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
24210 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
24220 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
24230 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
24240 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
24250 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
24260 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
24270 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
24280 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
24290 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
242a0 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
242b0 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
242c0 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
242d0 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
242e0 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
242f0 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24310 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
24320 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
24330 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
24340 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
24350 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
24360 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
24370 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24380 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
24390 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
243a0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
243b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
243c0 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fo) ){.    int i
243d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
243e0 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
243f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
24400 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
24410 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d  *pInfo = pWInfo-
24420 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[i].pIdxInfo;.
24430 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20        if( pInfo 
24440 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73  ){.        /* as
24450 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65  sert( pInfo->nee
24460 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
24470 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
24480 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20  iled ); */.     
24490 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
244a0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
244b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
244c0 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
244d0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
244e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
244f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e  e3DbFree(db, pIn
24500 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
24510 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61     if( pWInfo->a
24520 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [i].plan.wsFlags
24530 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
24540 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49  DEX ){.        I
24550 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49  ndex *pIdx = pWI
24560 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75  nfo->a[i].plan.u
24570 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  .pIdx;.        i
24580 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
24590 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
245a0 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f  ee(db, pIdx->zCo
245b0 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  lAff);.         
245c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
245d0 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  b, pIdx);.      
245e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
245f0 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  }.    whereClaus
24600 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70  eClear(pWInfo->p
24610 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  WC);.    sqlite3
24620 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
24630 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  o);.  }.}.../*.*
24640 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
24650 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
24660 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
24670 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
24680 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
24690 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
246a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
246b0 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
246c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
246d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
246e0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
246f0 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
24700 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
24710 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
24720 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
24730 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
24740 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
24750 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
24760 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
24770 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
24780 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
24790 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
247a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
247b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
247c0 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
247d0 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
247e0 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
247f0 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
24800 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
24810 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
24820 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
24830 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
24840 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
24850 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
24860 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
24870 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
24880 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
24890 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
248a0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
248b0 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
248c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
248d0 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
248e0 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
248f0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
24900 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
24910 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
24920 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
24930 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
24940 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
24950 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
24960 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
24970 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
24980 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
24990 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
249a0 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
249b0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
249c0 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
249d0 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
249e0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
249f0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
24a00 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
24a10 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
24a20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
24a50 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
24a60 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a80 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
24a90 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
24aa0 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
24ab0 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
24ac0 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
24ad0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
24ae0 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
24af0 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
24b00 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
24b10 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
24b20 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
24b30 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
24b40 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
24b50 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
24b60 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
24b70 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
24b80 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
24b90 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
24ba0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
24bb0 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
24bc0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
24bd0 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
24be0 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
24bf0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
24c00 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
24c10 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
24c20 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
24c30 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
24c40 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
24c50 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
24c60 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
24c70 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
24c80 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
24c90 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
24ca0 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
24cb0 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
24cc0 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
24cd0 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
24ce0 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
24cf0 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
24d00 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
24d10 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
24d20 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
24d30 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
24d40 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
24d50 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
24d60 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
24d70 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
24d80 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
24d90 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
24da0 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
24db0 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
24dc0 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
24dd0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
24de0 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
24df0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
24e00 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
24e10 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
24e20 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
24e30 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
24e40 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
24e50 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
24e60 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
24e70 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
24e80 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
24e90 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
24ea0 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
24eb0 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
24ec0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
24ed0 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
24ee0 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
24ef0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
24f00 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
24f10 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
24f20 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
24f30 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
24f40 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
24f50 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
24f60 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
24f70 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
24f80 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
24f90 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
24fa0 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
24fb0 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
24fc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
24fd0 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
24fe0 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
24ff0 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
25000 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
25010 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
25020 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
25030 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
25040 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
25050 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
25060 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
25070 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
25080 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
25090 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
250a0 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
250b0 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
250c0 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
250d0 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
250e0 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
250f0 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
25100 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
25110 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
25120 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
25130 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
25140 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
25150 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
25160 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
25170 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
25180 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
25190 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
251a0 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
251b0 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
251c0 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
251d0 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
251e0 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
251f0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
25200 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
25210 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
25220 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
25230 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
25240 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
25250 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
25260 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
25270 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
25280 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
25290 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
252a0 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
252b0 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
252c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
252d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
252e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
252f0 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
25300 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
25310 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
25320 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
25330 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
25340 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
25350 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
25360 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
25370 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
25380 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
25390 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
253a0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
253b0 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
253c0 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
253d0 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
253e0 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
253f0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
25400 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
25410 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
25420 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
25430 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
25440 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
25450 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
25460 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
25470 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
25480 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
25490 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
254a0 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
254b0 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
254c0 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
254d0 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
254e0 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
254f0 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
25500 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
25510 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
25520 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
25530 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
25540 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
25550 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
25560 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
25570 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
25580 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
25590 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
255a0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
255b0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
255c0 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
255d0 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
255e0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
255f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
25600 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
25610 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c  ist **ppOrderBy,
25620 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
25630 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
25640 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
25650 61 67 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ags        /* On
25660 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
25670 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
25680 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
25690 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
256c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57   */.  int nByteW
256d0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
256e0 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
256f0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
25700 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
25710 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25730 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
25740 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
25750 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
25760 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
25770 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
25780 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
25790 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
257a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
257b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
257c0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
257d0 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
257e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
257f0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
25800 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
25810 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
25820 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
25830 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
25840 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78  et;    /* The ex
25850 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
25860 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
25870 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
25880 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70         /* Decomp
25890 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57  osition of the W
258a0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
258b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
258c0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
258d0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
258e0 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
258f0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
25900 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
25910 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
25920 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
25930 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
25940 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
25970 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
25980 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
25990 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
259a0 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
259b0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
259c0 20 70 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67   pWC->a[].wtFlag
259d0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
259e0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
259f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
25a00 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
25a10 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
25a20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
25a30 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
25a40 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
25a50 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
25a60 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
25a70 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
25a80 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
25a90 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
25aa0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
25ab0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
25ac0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
25ad0 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
25ae0 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
25af0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
25b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
25b10 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
25b20 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
25b30 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
25b40 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
25b50 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
25b60 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
25b70 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
25b80 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
25b90 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
25ba0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
25bb0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
25bc0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
25bd0 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
25be0 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
25bf0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25c00 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
25c10 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
25c20 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
25c30 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
25c40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
25c50 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
25c60 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
25c70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
25c80 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
25c90 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
25ca0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
25cb0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
25cc0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
25cd0 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
25ce0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
25cf0 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
25d00 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
25d10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
25d20 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
25d30 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
25d40 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
25d50 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
25d60 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
25d70 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
25d80 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
25d90 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
25da0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
25db0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
25dc0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
25dd0 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
25de0 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
25df0 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
25e00 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
25e10 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
25e20 62 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  b;.  nByteWInfo 
25e30 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
25e40 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
25e50 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
25e60 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
25e70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
25e80 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
25e90 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66  .      nByteWInf
25ea0 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  o + .      sizeo
25eb0 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b  f(WhereClause) +
25ec0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68  .      sizeof(Wh
25ed0 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b  ereMaskSet).  );
25ee0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
25ef0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
25f00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25f10 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
25f20 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
25f30 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
25f40 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
25f50 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
25f60 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  ist;.  pWInfo->p
25f70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
25f80 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
25f90 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
25fa0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
25fb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25fc0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
25fd0 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d  nfo->pWC = pWC =
25fe0 20 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29   (WhereClause *)
25ff0 26 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b  &((u8 *)pWInfo)[
26000 6e 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70  nByteWInfo];.  p
26010 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26020 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a  s = wctrlFlags;.
26030 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e    pWInfo->savedN
26040 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
26050 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
26060 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68    pMaskSet = (Wh
26070 65 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43  ereMaskSet*)&pWC
26080 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  [1];..  /* Split
26090 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
260a0 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
260b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
260c0 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
260d0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
260e0 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
260f0 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
26100 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
26110 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (pMaskSet);.  wh
26120 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 57  ereClauseInit(pW
26130 43 2c 20 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C, pParse, pMask
26140 53 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Set);.  sqlite3E
26150 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
26160 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29  (pParse, pWhere)
26170 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70  ;.  whereSplit(p
26180 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  WC, pWhere, TK_A
26190 4e 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ND);   /* IMP: R
261a0 2d 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a  -15842-53296 */.
261b0 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
261c0 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
261d0 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
261e0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
261f0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
26200 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
26210 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
26220 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
26230 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
26240 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
26250 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73  nTabList==0 || s
26260 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
26270 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65  tantNotJoin(pWhe
26280 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  re)) ){.    sqli
26290 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
262a0 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
262b0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53  WInfo->iBreak, S
262c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
262d0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
262e0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73  0;.  }..  /* Ass
262f0 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74  ign a bit from t
26300 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76  he bitmask to ev
26310 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
26320 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
26330 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69  *.  ** When assi
26340 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61  gning bitmask va
26350 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61  lues to FROM cla
26360 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  use cursors, it 
26370 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65  must be.  ** the
26380 20 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20   case that if X 
26390 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  is the bitmask f
263a0 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d  or the N-th FROM
263b0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65   clause term the
263c0 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61  n.  ** the bitma
263d0 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20  sk for all FROM 
263e0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20  clause terms to 
263f0 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
26400 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69  N-th term.  ** i
26410 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78  s (X-1).   An ex
26420 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
26430 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
26440 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75   LEFT JOIN can u
26450 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72  se.  ** its Expr
26460 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
26470 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74   value to find t
26480 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68  he bitmask of th
26490 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
264a0 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
264b0 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65   Subtracting one
264c0 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20   from the right 
264d0 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69  table bitmask gi
264e0 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61  ves a.  ** bitma
264f0 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  sk for all table
26500 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
26510 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77   the join.  Know
26520 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a  ing the bitmask.
26530 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62    ** for all tab
26540 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
26550 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
26560 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  s important.  Ti
26570 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a  cket #3015..  **
26580 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  .  ** Configure 
26590 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
265a0 76 6d 61 73 6b 20 76 61 72 69 61 62 6c 65 20 73  vmask variable s
265b0 6f 20 74 68 61 74 20 62 69 74 73 20 74 68 61 74  o that bits that
265c0 20 63 6f 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a   correspond.  **
265d0 20 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c   to virtual tabl
265e0 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 73 65  e cursors are se
265f0 74 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  t. This is used 
26600 74 6f 20 73 65 6c 65 63 74 69 76 65 6c 79 20 64  to selectively d
26610 69 73 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65  isable .  ** the
26620 20 4f 52 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66   OR-to-IN transf
26630 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 65 78 70 72  ormation in expr
26640 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e  AnalyzeOrTerm().
26650 20 49 74 20 69 73 20 6e 6f 74 20 68 65 6c 70 66   It is not helpf
26660 75 6c 20 0a 20 20 2a 2a 20 77 69 74 68 20 76 69  ul .  ** with vi
26670 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20  rtual tables..  
26680 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
26690 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63  t bitmasks are c
266a0 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70  reated for all p
266b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61  TabList->nSrc ta
266c0 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61  bles in.  ** pTa
266d0 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20  bList, not just 
266e0 74 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69  the first nTabLi
266f0 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62  st tables.  nTab
26700 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  List is normally
26710 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70  .  ** equal to p
26720 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75  TabList->nSrc bu
26730 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  t might be short
26740 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65  ened to 1 if the
26750 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54  .  ** WHERE_ONET
26760 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69  ABLE_ONLY flag i
26770 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  s set..  */.  as
26780 73 65 72 74 28 20 70 57 43 2d 3e 76 6d 61 73 6b  sert( pWC->vmask
26790 3d 3d 30 20 26 26 20 70 4d 61 73 6b 53 65 74 2d  ==0 && pMaskSet-
267a0 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  >n==0 );.  for(i
267b0 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
267c0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
267d0 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b  createMask(pMask
267e0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
267f0 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69  [i].iCursor);.#i
26800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26810 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
26820 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54     if( ALWAYS(pT
26830 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
26840 62 29 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  b) && IsVirtual(
26850 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
26860 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57  Tab) ){.      pW
26870 43 2d 3e 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69  C->vmask |= ((Bi
26880 74 6d 61 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20  tmask)1 << i);. 
26890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
268a0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
268b0 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
268c0 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
268d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
268e0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
268f0 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
26900 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   m = getMask(pMa
26910 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
26920 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
26930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
26940 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29  -1)==toTheLeft )
26950 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66  ;.      toTheLef
26960 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20  t |= m;.    }.  
26970 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
26980 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68  nalyze all of th
26990 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
269a0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70  .  Note that exp
269b0 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74  rAnalyze() might
269c0 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69  .  ** add new vi
269d0 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f  rtual terms onto
269e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
269f0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57  WHERE clause.  W
26a00 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61  e do not.  ** wa
26a10 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  nt to analyze th
26a20 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ese virtual term
26a30 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c  s, so start anal
26a40 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  yzing at the end
26a50 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66  .  ** and work f
26a60 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74  orward so that t
26a70 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c  he added virtual
26a80 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72   terms are never
26a90 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f   processed..  */
26aa0 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
26ab0 6c 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 29  l(pTabList, pWC)
26ac0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
26ad0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
26ae0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
26af0 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
26b00 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
26b10 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
26b20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
26b30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
26b40 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
26b50 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
26b60 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
26b70 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
26b80 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
26b90 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
26ba0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
26bb0 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
26bc0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
26bd0 61 5b 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48  a[].wsFlags   WH
26be0 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
26bf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
26c00 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
26c10 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
26c20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
26c30 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
26c40 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
26c50 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
26c60 20 57 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74   Which term of t
26c70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
26c80 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
26c90 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
26ca0 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
26cb0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
26cc0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
26cd0 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
26ce0 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
26cf0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
26d00 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
26d10 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
26d20 70 54 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77  pTerm     When w
26d30 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74  sFlags==WO_OR, t
26d40 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72  he OR-clause ter
26d50 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  m.  **.  ** This
26d60 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72   loop also figur
26d70 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69  es out the nesti
26d80 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  ng order of tabl
26d90 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
26da0 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
26db0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
26dc0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61  Bitmask)0;.  pTa
26dd0 62 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  bItem = pTabList
26de0 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20  ->a;.  pLevel = 
26df0 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64  pWInfo->a;.  and
26e00 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48  Flags = ~0;.  WH
26e10 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
26e20 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a  ptimizer Start *
26e30 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69  **\n"));.  for(i
26e40 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c  =iFrom=0, pLevel
26e50 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
26e60 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
26e70 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
26e80 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
26e90 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
26ea0 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
26eb0 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
26ec0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ee0 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
26ef0 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
26f00 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
26f30 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
26f40 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
26f50 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20  bestJ = -1;     
26f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
26f70 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
26f80 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fa0 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
26fb0 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
26fc0 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61      int isOptima
26fd0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
26fe0 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
26ff0 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69  optimal/non-opti
27000 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  mal search */.  
27010 20 20 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61    int nUnconstra
27020 69 6e 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ined;         /*
27030 20 4e 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77   Number tables w
27040 69 74 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42  ithout INDEXED B
27050 59 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  Y */.    Bitmask
27060 20 6e 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20   notIndexed;    
27070 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
27080 74 61 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e  tables that cann
27090 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20  ot use an index 
270a0 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
270b0 62 65 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a  bestPlan, 0, siz
270c0 65 6f 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a  eof(bestPlan));.
270d0 20 20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f      bestPlan.rCo
270e0 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
270f0 44 42 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52  DBL;.    WHERETR
27100 41 43 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20  ACE(("*** Begin 
27110 73 65 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20  search for loop 
27120 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a  %d ***\n", i));.
27130 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
27140 6f 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69  ough the remaini
27150 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ng entries in th
27160 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f  e FROM clause to
27170 20 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a   find the.    **
27180 20 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f   next nested loo
27190 70 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74  p. The loop test
271a0 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
271b0 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  e entries.    **
271c0 20 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20   either once or 
271d0 74 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20  twice. .    **. 
271e0 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
271f0 74 65 73 74 20 69 73 20 61 6c 77 61 79 73 20 70  test is always p
27200 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72  erformed if ther
27210 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
27220 65 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  e entries.    **
27230 20 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e   remaining and n
27240 65 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69  ever performed i
27250 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  f there is only 
27260 6f 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  one FROM clause 
27270 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20  entry.    ** to 
27280 63 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68  choose from.  Th
27290 65 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f  e first test loo
272a0 6b 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d  ks for an "optim
272b0 61 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20  al" scan.  In.  
272c0 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78    ** this contex
272d0 74 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61  t an optimal sca
272e0 6e 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73  n is one that us
272f0 65 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61  es the same stra
27300 74 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20  tegy.    ** for 
27310 74 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63  the given FROM c
27320 6c 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77  lause entry as w
27330 6f 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64  ould be selected
27340 20 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20   if the entry.  
27350 20 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61    ** were used a
27360 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
27370 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e  nested loop.  In
27380 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
27390 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
273a0 63 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74  chosen such that
273b0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e   the cost of run
273c0 6e 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20  ning that table 
273d0 63 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65  cannot be reduce
273e0 64 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74  d.    ** by wait
273f0 69 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61  ing for other ta
27400 62 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73  bles to run firs
27410 74 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61  t.  This "optima
27420 6c 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20  l" test works.  
27430 20 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73    ** by first as
27440 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
27450 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f  FROM clause is o
27460 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
27470 20 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20   and finding.   
27480 20 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c   ** its query pl
27490 61 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e  an, then checkin
274a0 67 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74  g to see if that
274b0 20 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73   query plan uses
274c0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65   any.    ** othe
274d0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  r FROM clause te
274e0 72 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  rms that are not
274f0 52 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f  Ready.  If no no
27500 74 52 65 61 64 79 20 74 65 72 6d 73 20 61 72 65  tReady terms are
27510 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65  .    ** used the
27520 6e 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20  n the "optimal" 
27530 71 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73  query plan works
27540 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27550 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 57 68  Note that the Wh
27560 65 72 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72  ereCost.nRow par
27570 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
27580 74 69 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74  timal scan might
27590 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  .    ** not be a
275a0 73 20 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f  s small as it wo
275b0 75 6c 64 20 62 65 20 69 66 20 74 68 65 20 74 61  uld be if the ta
275c0 62 6c 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20  ble really were 
275d0 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20  the innermost.  
275e0 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20    ** join.  The 
275f0 6e 52 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62  nRow value can b
27600 65 20 72 65 64 75 63 65 64 20 62 79 20 57 48 45  e reduced by WHE
27610 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
27620 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61  aints.    ** tha
27630 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64  t do not use ind
27640 69 63 65 73 2e 20 20 42 75 74 20 74 68 69 73 20  ices.  But this 
27650 6e 52 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f  nRow reduction o
27660 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
27670 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  he.    ** table 
27680 72 65 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e  really is the in
27690 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a  nermost join.  .
276a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
276b0 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74  e second loop it
276c0 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  eration is only 
276d0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20  performed if no 
276e0 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20  optimal scan.   
276f0 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20 77   ** strategies w
27700 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65  ere found by the
27710 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
27720 2e 20 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74  . This second it
27730 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  eration.    ** i
27740 73 20 75 73 65 64 20 74 6f 20 73 65 61 72 63 68  s used to search
27750 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20   for the lowest 
27760 63 6f 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c  cost scan overal
27770 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
27780 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
27790 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72  ns of SQLite per
277a0 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20  formed only the 
277b0 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
277c0 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65   -.    ** the ne
277d0 78 74 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  xt outermost loo
277e0 70 20 77 61 73 20 61 6c 77 61 79 73 20 74 68 61  p was always tha
277f0 74 20 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73  t with the lowes
27800 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a  t overall.    **
27810 20 63 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20   cost. However, 
27820 74 68 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20  this meant that 
27830 53 51 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c  SQLite could sel
27840 65 63 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c  ect the wrong pl
27850 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63  an.    ** for sc
27860 72 69 70 74 73 20 73 75 63 68 20 61 73 20 74 68  ripts such as th
27870 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
27880 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20   **   .    **   
27890 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
278a0 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20  a, b); .    **  
278b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
278c0 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20  (c, d);.    **  
278d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
278e0 32 2c 20 74 31 20 57 48 45 52 45 20 74 32 2e 72  2, t1 WHERE t2.r
278f0 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20  owid = t1.a;.   
27900 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62   **.    ** The b
27910 65 73 74 20 73 74 72 61 74 65 67 79 20 69 73 20  est strategy is 
27920 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
27930 67 68 20 74 61 62 6c 65 20 74 31 20 66 69 72 73  gh table t1 firs
27940 74 2e 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20  t. However it.  
27950 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
27960 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  ible to determin
27970 65 20 74 68 69 73 20 77 69 74 68 20 61 20 73 69  e this with a si
27980 6d 70 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f  mple greedy algo
27990 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69  rithm..    ** Si
279a0 6e 63 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  nce the cost of 
279b0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
279c0 72 6f 75 67 68 20 74 61 62 6c 65 20 74 32 20 69  rough table t2 i
279d0 73 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20  s the same .    
279e0 2a 2a 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f  ** as the cost o
279f0 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  f a linear scan 
27a00 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
27a10 2c 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  , a simple greed
27a20 79 20 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69  y .    ** algori
27a30 74 68 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74  thm may choose t
27a40 6f 20 75 73 65 20 74 32 20 66 6f 72 20 74 68 65  o use t2 for the
27a50 20 6f 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69   outer loop, whi
27a60 63 68 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20  ch is a much.   
27a70 20 2a 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70   ** costlier app
27a80 72 6f 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  roach..    */.  
27a90 20 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64    nUnconstrained
27aa0 20 3d 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64   = 0;.    notInd
27ab0 65 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f  exed = 0;.    fo
27ac0 72 28 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72  r(isOptimal=(iFr
27ad0 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20  om<nTabList-1); 
27ae0 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20  isOptimal>=0 && 
27af0 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d  bestJ<0; isOptim
27b00 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74  al--){.      Bit
27b10 6d 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20  mask mask;      
27b20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
27b30 66 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74  f tables not yet
27b40 20 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20   ready */.      
27b50 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61  for(j=iFrom, pTa
27b60 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d  bItem=&pTabList-
27b70 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73  >a[j]; j<nTabLis
27b80 74 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  t; j++, pTabItem
27b90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
27ba0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
27bb0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
27bc0 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
27bd0 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
27be0 2a 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  */.        Where
27bf0 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20  Cost sCost;     
27c00 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74  /* Cost informat
27c10 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69  ion from best[Vi
27c20 72 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f  rtual]Index() */
27c30 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
27c40 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
27c50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27c60 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70   for index to op
27c70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20  timize */.  .   
27c80 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65       doNotReorde
27c90 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e  r =  (pTabItem->
27ca0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
27cb0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
27cc0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  0;.        if( j
27cd0 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74  !=iFrom && doNot
27ce0 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
27cf0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
27d00 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
27d10 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
27d20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
27d30 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  m & notReady)==0
27d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
27d50 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
27d60 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  om++;.          
27d70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27d80 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73 6b    }.        mask
27d90 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20   = (isOptimal ? 
27da0 6d 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  m : notReady);. 
27db0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
27dc0 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72  = ((i==0 && ppOr
27dd0 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72  derBy )?*ppOrder
27de0 42 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 69  By:0);.        i
27df0 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  f( pTabItem->pIn
27e00 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73  dex==0 ) nUncons
27e10 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20  trained++;.  .  
27e20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
27e30 28 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61  (("=== trying ta
27e40 62 6c 65 20 25 64 20 77 69 74 68 20 69 73 4f 70  ble %d with isOp
27e50 74 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c  timal=%d ===\n",
27e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27e70 20 20 20 20 20 6a 2c 20 69 73 4f 70 74 69 6d 61       j, isOptima
27e80 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l));.        ass
27e90 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70  ert( pTabItem->p
27ea0 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  Tab );.#ifndef S
27eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
27ec0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
27ed0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
27ee0 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  abItem->pTab) ){
27ef0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27f00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
27f10 70 70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  pp = &pWInfo->a[
27f20 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
27f30 20 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75         bestVirtu
27f40 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  alIndex(pParse, 
27f50 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d  pWC, pTabItem, m
27f60 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  ask, notReady, p
27f70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 26 73 43 6f 73 74 2c 20 70 70 29 3b      &sCost, pp);
27fa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  .        }else .
27fb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
27fc0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42  .          bestB
27fd0 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65  treeIndex(pParse
27fe0 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
27ff0 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c   mask, notReady,
28000 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28020 20 20 20 20 26 73 43 6f 73 74 29 3b 0a 20 20 20      &sCost);.   
28030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28040 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c  ssert( isOptimal
28050 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26   || (sCost.used&
28060 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a  notReady)==0 );.
28070 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
28080 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
28090 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  use is present, 
280a0 74 68 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75  then the plan mu
280b0 73 74 20 75 73 65 20 74 68 61 74 0a 20 20 20 20  st use that.    
280c0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20      ** index if 
280d0 69 74 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65  it uses any inde
280e0 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20  x at all */.    
280f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28100 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  Item->pIndex==0 
28110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28120 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61     || (sCost.pla
28130 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
28140 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d  E_NOT_FULLSCAN)=
28150 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
28160 20 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e 70 6c       || sCost.pl
28170 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61 62 49  an.u.pIdx==pTabI
28180 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a  tem->pIndex );..
28190 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
281a0 74 69 6d 61 6c 20 26 26 20 28 73 43 6f 73 74 2e  timal && (sCost.
281b0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
281c0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
281d0 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)==0 ){.       
281e0 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d     notIndexed |=
281f0 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   m;.        }.. 
28200 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74         /* Condit
28210 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68  ions under which
28220 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 63 6f   this table beco
28230 6d 65 73 20 74 68 65 20 62 65 73 74 20 73 6f 20  mes the best so 
28240 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  far:.        **.
28250 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29          **   (1)
28260 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
28270 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74  not depend on ot
28280 68 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  her tables that 
28290 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20 20 20  have not.       
282a0 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20 72 75   **       yet ru
282b0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
282c0 20 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20 41        **   (2) A
282d0 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e   full-table-scan
282e0 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70   plan cannot sup
282f0 65 72 63 65 64 65 20 61 6e 6f 74 68 65 72 20 70  ercede another p
28300 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20 20 20  lan unless.     
28310 20 20 20 2a 2a 20 20 20 20 20 20 20 69 74 20 69     **       it i
28320 73 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70  s an "optimal" p
28330 6c 61 6e 20 61 73 20 64 65 66 69 6e 65 64 20 61  lan as defined a
28340 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  bove..        **
28350 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33  .        **   (3
28360 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76  ) All tables hav
28370 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  e an INDEXED BY 
28380 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
28390 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20  able lacks an.  
283a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49        **       I
283b0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
283c0 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 75   or this table u
283d0 73 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63  ses the specific
283e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
283f0 20 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65    index specifie
28400 64 20 62 79 20 69 74 73 20 49 4e 44 45 58 45 44  d by its INDEXED
28410 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69   BY clause.  Thi
28420 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20  s rule ensures. 
28430 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
28440 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66  that a best-so-f
28450 61 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c  ar is always sel
28460 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e  ected even if an
28470 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   impossible.    
28480 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d      **       com
28490 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45  bination of INDE
284a0 58 45 44 20 42 59 20 63 6c 61 75 73 65 73 20 61  XED BY clauses a
284b0 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65  re given.  The e
284c0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rror.        ** 
284d0 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65        will be de
284e0 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79  tected and relay
284f0 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61  ed back to the a
28500 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72  pplication later
28510 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
28520 20 20 20 54 68 65 20 4e 45 56 45 52 28 29 20 63     The NEVER() c
28530 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63 61 75  omes about becau
28540 73 65 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76  se rule (2) abov
28550 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20  e prevents.     
28560 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69     **       An i
28570 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61  ndexable full-ta
28580 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65  ble-scan from re
28590 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e  aching rule (3).
285a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
285b0 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65      **   (4) The
285c0 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20   plan cost must 
285d0 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72  be lower than pr
285e0 69 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73  ior plans or els
285f0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
28600 20 20 20 20 20 20 20 63 6f 73 74 20 6d 75 73 74         cost must
28610 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64   be the same and
28620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
28630 6f 77 73 20 6d 75 73 74 20 62 65 20 6c 6f 77 65  ows must be lowe
28640 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
28650 20 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74        if( (sCost
28660 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d  .used&notReady)=
28670 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
28680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
28690 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  */.            &
286a0 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e  & (bestJ<0 || (n
286b0 6f 74 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20  otIndexed&m)!=0 
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
286d0 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
286e0 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73          || (sCos
286f0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
28700 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
28710 43 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20  CAN)!=0).       
28720 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73       && (nUncons
28730 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54  trained==0 || pT
28740 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d  abItem->pIndex==
28750 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20  0   /* (3) */.  
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
28770 20 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c   NEVER((sCost.pl
28780 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
28790 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
287a0 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  !=0)).          
287b0 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c    && (bestJ<0 ||
287c0 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73   sCost.rCost<bes
287d0 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20  tPlan.rCost     
287e0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
287f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73             || (s
28800 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74  Cost.rCost<=best
28810 50 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20  Plan.rCost .    
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
28830 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c  sCost.plan.nRow<
28840 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
28850 6f 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow)).        ){.
28860 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
28870 52 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65  RACE(("=== table
28880 20 25 64 20 69 73 20 62 65 73 74 20 73 6f 20 66   %d is best so f
28890 61 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar".            
288a0 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
288b0 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f   cost=%g and nRo
288c0 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w=%g\n",.       
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
288e0 2c 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73  , sCost.rCost, s
288f0 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29  Cost.plan.nRow))
28900 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
28910 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20  Plan = sCost;.  
28920 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
28930 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
28940 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65       if( doNotRe
28950 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
28960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28970 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d   assert( bestJ>=
28980 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
28990 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d   notReady & getM
289a0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
289b0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
289c0 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20  .iCursor) );.   
289d0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
289e0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65  * Optimizer sele
289f0 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72  cts table %d for
28a00 20 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20   loop %d".      
28a10 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68            " with
28a20 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f   cost=%g and nRo
28a30 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w=%g\n",.       
28a40 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20           bestJ, 
28a50 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
28a60 2c 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  , bestPlan.rCost
28a70 2c 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  , bestPlan.plan.
28a80 6e 52 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20  nRow));.    if( 
28a90 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
28aa0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
28ab0 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
28ac0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
28ad0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
28ae0 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c  dFlags &= bestPl
28af0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  an.plan.wsFlags;
28b00 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  .    pLevel->pla
28b10 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  n = bestPlan.pla
28b20 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  n;.    testcase(
28b30 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
28b40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
28b50 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74 65  NDEXED );.    te
28b60 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e  stcase( bestPlan
28b70 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
28b80 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
28b90 20 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73 74   );.    if( best
28ba0 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
28bb0 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58  s & (WHERE_INDEX
28bc0 45 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e  ED|WHERE_TEMP_IN
28bd0 44 45 58 29 20 29 7b 0a 20 20 20 20 20 20 70 4c  DEX) ){.      pL
28be0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
28bf0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
28c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28c10 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28c20 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
28c30 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
28c40 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
28c50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
28c60 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
28c70 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
28c80 20 28 75 38 29 62 65 73 74 4a 3b 0a 20 20 20 20   (u8)bestJ;.    
28c90 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  if( bestPlan.pla
28ca0 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29  n.nRow>=(double)
28cb0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  1 ){.      pPars
28cc0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d  e->nQueryLoop *=
28cd0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
28ce0 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Row;.    }..    
28cf0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 69 66  /* Check that if
28d00 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e   the table scann
28d10 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ed by this loop 
28d20 69 74 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e  iteration had an
28d30 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20  .    ** INDEXED 
28d40 42 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68  BY clause attach
28d50 65 64 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74  ed to it, that t
28d60 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69  he named index i
28d70 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75  s being.    ** u
28d80 73 65 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e  sed for the scan
28d90 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71  . If not, then q
28da0 75 65 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  uery compilation
28db0 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20   has failed..   
28dc0 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72   ** Return an er
28dd0 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
28de0 70 49 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d  pIdx = pTabList-
28df0 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78  >a[bestJ].pIndex
28e00 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29  ;.    if( pIdx )
28e10 7b 0a 20 20 20 20 20 20 69 66 28 20 28 62 65 73  {.      if( (bes
28e20 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
28e30 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28e40 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)==0 ){.      
28e50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28e60 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
28e70 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22  t use index: %s"
28e80 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
28e90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
28ea0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
28eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28ec0 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45     /* If an INDE
28ed0 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73  XED BY clause is
28ee0 20 75 73 65 64 2c 20 74 68 65 20 62 65 73 74 49   used, the bestI
28ef0 6e 64 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  ndex() function 
28f00 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  is.        ** gu
28f10 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64  aranteed to find
28f20 20 74 68 65 20 69 6e 64 65 78 20 73 70 65 63 69   the index speci
28f30 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45  fied in the INDE
28f40 58 45 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20  XED BY clause.  
28f50 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66        ** if it f
28f60 69 6e 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20  ind an index at 
28f70 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  all. */.        
28f80 61 73 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e  assert( bestPlan
28f90 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49  .plan.u.pIdx==pI
28fa0 64 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx );.      }.  
28fb0 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54    }.  }.  WHERET
28fc0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
28fd0 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
28fe0 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50  *\n"));.  if( pP
28ff0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
29000 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29010 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
29020 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
29030 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74  .  /* If the tot
29040 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65  al query only se
29050 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72  lects a single r
29060 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44  ow, then the ORD
29070 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
29080 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e  e is irrelevant.
29090 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64  .  */.  if( (and
290a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
290b0 49 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72  IQUE)!=0 && ppOr
290c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70  derBy ){.    *pp
290d0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
290e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
290f0 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54  ller is an UPDAT
29100 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
29110 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65  ement that is re
29120 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  questing.  ** to
29130 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20   use a one-pass 
29140 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72  algorithm, deter
29150 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20  mine if this is 
29160 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a  appropriate..  *
29170 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61  * The one-pass a
29180 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f  lgorithm only wo
29190 72 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45  rks if the WHERE
291a0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
291b0 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  nts.  ** the sta
291c0 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65  tement to update
291d0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20   a single row.. 
291e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
291f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
29200 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
29210 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d  D)==0 || pWInfo-
29220 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20  >nLevel==1 );.  
29230 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
29240 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
29250 44 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28  DESIRED)!=0 && (
29260 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
29270 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20  _UNIQUE)!=0 ){. 
29280 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65     pWInfo->okOne
29290 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57  Pass = 1;.    pW
292a0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e  Info->a[0].plan.
292b0 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
292c0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
292d0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
292e0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
292f0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
29300 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
29310 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
29320 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
29330 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
29340 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
29350 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
29360 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
29370 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
29380 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
29390 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
293a0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
293b0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c  Info->a; i<nTabL
293c0 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  ist; i++, pLevel
293d0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
293e0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
293f0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
29400 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
29410 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
29420 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
29430 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
29440 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  /..    pTabItem 
29450 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
29460 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
29470 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
29480 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 4c  em->pTab;.    pL
29490 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
294a0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
294b0 72 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  r;.    iDb = sql
294c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
294d0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
294e0 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ema);.    if( (p
294f0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
29500 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
29510 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
29520 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t ){.      /* Do
29530 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
29540 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  }else.#ifndef SQ
29550 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
29560 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28  LTABLE.    if( (
29570 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
29580 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
29590 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
295a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
295b0 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
295c0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
295d0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
295e0 61 62 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab);.      int i
295f0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
29600 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
29610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29620 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
29630 75 72 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c  ur, 0, 0, pVTab,
29640 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d   P4_VTAB);.    }
29650 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
29660 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
29670 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
29680 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
29690 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
296a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
296b0 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a  MIT_OPEN)==0 ){.
296c0 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
296d0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
296e0 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20   ? OP_OpenWrite 
296f0 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  : OP_OpenRead;. 
29700 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
29710 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
29720 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
29730 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b   iDb, pTab, op);
29740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29750 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
29760 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
29770 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
29780 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
29790 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
297a0 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
297b0 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20  Col<BMS ){.     
297c0 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
297d0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
297e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
297f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
29800 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
29810 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
29820 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
29830 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
29840 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
29850 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
29870 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
29880 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
29890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
298a0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
298b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
298c0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
298d0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
298e0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
298f0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
29900 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
29910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29920 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
29930 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
29940 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
29950 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21  ERE_TEMP_INDEX)!
29960 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
29970 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e  tructAutomaticIn
29980 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
29990 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
299a0 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
299b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
299c0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
299d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
299e0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
299f0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
29a00 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  *pIx = pLevel->p
29a10 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
29a20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
29a30 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
29a40 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
29a50 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  x);.      int iI
29a60 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
29a70 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61  iIdxCur;.      a
29a80 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
29a90 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
29aa0 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
29ab0 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29  rt( iIdxCur>=0 )
29ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29ad0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29ae0 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
29af0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
29b00 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
29b10 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
29b20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
29b30 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
29b40 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29b50 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
29b60 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
29b70 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
29b80 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
29b90 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65   iDb);.    notRe
29ba0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
29bb0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70  pWC->pMaskSet, p
29bc0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
29bd0 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
29be0 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
29bf0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
29c00 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
29c10 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
29c20 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29c30 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
29c40 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20   the code to do 
29c50 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61 63  the search.  Eac
29c60 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
29c70 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70  he for.  ** loop
29c80 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73   below generates
29c90 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
29ca0 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  le nested loop o
29cb0 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72  f the VM.  ** pr
29cc0 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  ogram..  */.  no
29cd0 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
29ce0 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sk)0;.  for(i=0;
29cf0 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b   i<nTabList; i++
29d00 29 7b 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  ){.    if( (wctr
29d10 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45  lFlags&WHERE_ONE
29d20 54 41 42 4c 45 5f 4f 4e 4c 59 29 3d 3d 30 20 29  TABLE_ONLY)==0 )
29d30 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 6e 65 4c  {.      codeOneL
29d40 6f 6f 70 45 78 70 6c 61 69 6e 28 70 50 61 72 73  oopExplain(pPars
29d50 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57  e, pTabList, &pW
29d60 49 6e 66 6f 2d 3e 61 5b 69 5d 2c 69 2c 70 57 49  Info->a[i],i,pWI
29d70 6e 66 6f 2d 3e 61 5b 69 5d 2e 69 46 72 6f 6d 29  nfo->a[i].iFrom)
29d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
29d90 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
29da0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
29db0 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e  i, wctrlFlags, n
29dc0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
29dd0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
29de0 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 61  = pWInfo->a[i].a
29df0 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69  ddrCont;.  }..#i
29e00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
29e10 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67    /* For testing
29e20 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
29e30 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20  se only */.  /* 
29e40 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75  Record in the qu
29e50 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61  ery plan informa
29e60 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
29e70 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a  urrent table.  *
29e80 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
29e90 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69  used to access i
29ea0 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20  t (if any).  If 
29eb0 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
29ec0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
29ed0 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a  d, its name is j
29ee0 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f  ust '{}'.  If no
29ef0 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20   index is used. 
29f00 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
29f10 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e   listed as "{}".
29f20 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79    If the primary
29f30 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65   key is used the
29f40 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65  .  ** index name
29f50 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20   is '*'..  */.  
29f60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c  for(i=0; i<nTabL
29f70 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ist; i++){.    c
29f80 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
29f90 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
29fa0 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
29fb0 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
29fc0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
29fd0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
29fe0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
29ff0 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
2a000 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
2a010 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
2a020 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
2a030 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
2a040 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
2a050 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
2a060 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
2a070 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2a080 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2a090 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
2a0a0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2a0b0 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
2a0c0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
2a0d0 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
2a0e0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
2a0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a100 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
2a110 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2a120 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
2a130 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
2a140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a150 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2a160 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
2a170 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
2a180 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
2a190 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2a1a0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b  HERE_ROWID_EQ );
2a1b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2a1c0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2a1d0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
2a1e0 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69  D_RANGE );.    i
2a1f0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
2a200 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2a210 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
2a220 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
2a230 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
2a240 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2a250 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
2a260 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
2a270 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
2a280 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2a290 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a2a0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2a2b0 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  {.      n = sqli
2a2c0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76  te3Strlen30(pLev
2a2d0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
2a2e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
2a2f0 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
2a300 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
2a310 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
2a320 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
2a330 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2a340 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
2a350 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
2a360 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
2a370 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
2a380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71         sqlite3_q
2a390 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
2a3a0 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
2a3b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2a3c0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
2a3d0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2a3e0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33  QPlan], "{} ", 3
2a3f0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
2a400 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 3;.    }.  }.
2a410 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
2a420 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
2a430 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
2a440 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
2a450 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2a460 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
2a470 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
2a480 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
2a490 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
2a4a0 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
2a4b0 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
2a4c0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2a4d0 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
2a4e0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
2a4f0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
2a500 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
2a510 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
2a520 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
2a530 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
2a540 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
2a550 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
2a560 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
2a570 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
2a580 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
2a590 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
2a5a0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2a5b0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2a5c0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
2a5d0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2a5e0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
2a5f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a600 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2a610 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2a620 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
2a630 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
2a640 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2a650 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
2a660 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2a670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2a680 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
2a690 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
2a6a0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
2a6b0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
2a6c0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2a6d0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2a6e0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2a6f0 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
2a700 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
2a710 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
2a720 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2a730 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
2a740 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65  Generate loop te
2a750 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  rmination code..
2a760 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
2a770 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2a780 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
2a790 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2a7a0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2a7b0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
2a7c0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69  ->a[i];.    sqli
2a7d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2a7e0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2a7f0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66  ddrCont);.    if
2a800 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
2a810 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
2a820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a830 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20  (v, pLevel->op, 
2a840 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
2a850 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73  el->p2);.      s
2a860 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a870 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35  P5(v, pLevel->p5
2a880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a890 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
2a8a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2a8b0 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d  _ABLE && pLevel-
2a8c0 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20  >u.in.nIn>0 ){. 
2a8d0 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
2a8e0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
2a8f0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
2a900 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2a910 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2a920 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66  ddrNxt);.      f
2a930 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69  or(j=pLevel->u.i
2a940 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  n.nIn, pIn=&pLev
2a950 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
2a960 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  [j-1]; j>0; j--,
2a970 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20   pIn--){.       
2a980 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2a990 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
2a9a0 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20  rInTop+1);.     
2a9b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a9c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
2a9d0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
2a9e0 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
2a9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2aa00 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
2aa10 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20  >addrInTop-1);. 
2aa20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2aa30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2aa40 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
2aa50 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
2aa60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2aa70 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2aa80 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
2aa90 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
2aaa0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
2aab0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
2aac0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2aad0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2aae0 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  fPos, pLevel->iL
2aaf0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
2ab00 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d  assert( (pLevel-
2ab10 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2ab20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2ab30 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
2ab40 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2ab50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2ab60 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
2ab70 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
2ab80 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2ab90 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2aba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2abb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2abc0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
2abd0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
2abe0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
2abf0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2ac00 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a  ->iIdxCur>=0 ){.
2ac10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ac20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ac30 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d  NullRow, pLevel-
2ac40 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
2ac50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
2ac60 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75  vel->op==OP_Retu
2ac70 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rn ){.        sq
2ac80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ac90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65  v, OP_Gosub, pLe
2aca0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2acb0 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2acc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2acd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ace0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2acf0 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  0, pLevel->addrF
2ad00 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  irst);.      }. 
2ad10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ad20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2ad30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2ad40 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
2ad50 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
2ad60 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
2ad70 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
2ad80 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
2ad90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2ada0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2adb0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2adc0 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
2add0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
2ade0 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
2adf0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
2ae00 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
2ae10 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2ae20 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57 49  nLevel==1 || pWI
2ae30 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61  nfo->nLevel==pTa
2ae40 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
2ae50 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
2ae60 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57  =pWInfo->a; i<pW
2ae70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
2ae80 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2ae90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2aea0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
2aeb0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
2aec0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
2aed0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
2aee0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
2aef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
2af00 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
2af10 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
2af20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
2af30 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
2af40 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
2af50 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2af60 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2af70 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20  OMIT_CLOSE)==0. 
2af80 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20     ){.      int 
2af90 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ws = pLevel->pla
2afa0 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  n.wsFlags;.     
2afb0 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
2afc0 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26  OnePass && (ws &
2afd0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2afe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2aff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2b000 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
2b010 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
2b020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b030 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  if( (ws & WHERE_
2b040 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28  INDEXED)!=0 && (
2b050 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  ws & WHERE_TEMP_
2b060 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20  INDEX)==0 ){.   
2b070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b080 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
2b090 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
2b0a0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
2b0b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2b0c0 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
2b0d0 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64   index, make cod
2b0e0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
2b0f0 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20  to read data.   
2b100 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   ** from the ind
2b110 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65  ex in preference
2b120 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53   to the table. S
2b130 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d  ometimes, this m
2b140 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  eans.    ** the 
2b150 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72  table need never
2b160 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54   be read from. T
2b170 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d  his is a perform
2b180 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20  ance boost,.    
2b190 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c  ** as the vdbe l
2b1a0 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c  evel waits until
2b1b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65   the table is re
2b1c0 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c  ad before actual
2b1d0 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e  ly.    ** seekin
2b1e0 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  g the table curs
2b1f0 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  or to the record
2b200 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2b210 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  o the current.  
2b220 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e    ** position in
2b230 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
2b240 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73  ** .    ** Calls
2b250 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
2b260 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65  erator in betwee
2b270 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  n sqlite3WhereBe
2b280 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73  gin and.    ** s
2b290 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77  qlite3WhereEnd w
2b2a0 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64  ill have created
2b2b0 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72   code that refer
2b2c0 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a  ences the table.
2b2d0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e      ** directly.
2b2e0 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e    This loop scan
2b2f0 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20  s all that code 
2b300 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f  looking for opco
2b310 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  des.    ** that 
2b320 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61  reference the ta
2b330 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73  ble and converts
2b340 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64   them into opcod
2b350 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72  es that.    ** r
2b360 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64  eference the ind
2b370 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
2b380 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2b390 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2b3a0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
2b3b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
2b3c0 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c  d){.      int k,
2b3d0 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
2b3e0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
2b3f0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
2b400 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
2b410 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73  pIdx;..      ass
2b420 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
2b430 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
2b440 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
2b450 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20  pWInfo->iTop);. 
2b460 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
2b470 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2b480 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
2b490 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b  (k=pWInfo->iTop;
2b4a0 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
2b4b0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
2b4c0 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
2b4d0 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
2b4e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2b4f0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2b500 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
2b510 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2b520 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
2b530 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2b540 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
2b550 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
2b560 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
2b570 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a     pOp->p2 = j;.
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
2b590 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2b5a0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2b5b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b5c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b5e0 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65    assert( (pLeve
2b5f0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2b600 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2b610 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2b620 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e      || j<pIdx->n
2b630 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
2b640 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
2b650 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
2b660 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
2b670 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2b680 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2b690 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2b6a0 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
2b6b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b6c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b6d0 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20   Final cleanup. 
2b6e0 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51   */.  pParse->nQ
2b6f0 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66  ueryLoop = pWInf
2b700 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2b710 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  op;.  whereInfoF
2b720 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2b730 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.