/ Hex Artifact Content
Login

Artifact 7db3e41c2a846f9deeb24f1bbb75461b4010b7b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0350: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0370: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0380: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
03a0: 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
03b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
03c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
03e0: 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57 48  BUG).# define WH
03f0: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0410: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0420: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0430: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0440: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
0450: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
0460: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
0470: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
0480: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0490: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04a0: 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61  eMaskSet WhereMa
04b0: 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73  skSet;.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
04d0: 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74  o WhereOrInfo;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65  ereAndInfo Where
0500: 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  AndInfo;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73   struct WhereCos
0520: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
0530: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0540: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0550: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0560: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0570: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0580: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0590: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
05a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05b0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05c0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05e0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05f0: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
0600: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
0610: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
0620: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
0630: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
0640: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
0650: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
0660: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
0670: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0680: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
0690: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
06a0: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
06b0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
06c0: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
06d0: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
06e0: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
06f0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
0700: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
0710: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
0720: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
0730: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
0740: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
0750: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
0760: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
0770: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
0780: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
0790: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
07a0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07b0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07d0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07e0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
07f0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
0800: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
0810: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
0820: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
0830: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
0840: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
0850: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
0860: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
0870: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
0880: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
0890: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
08a0: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
08b0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
08c0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
08d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
08e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
08f0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
0900: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
0910: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
0920: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
0930: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
0940: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
0950: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
0960: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
0970: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
0980: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
0990: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
09a0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
09b0: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
09c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
09d0: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
09e0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
09f0: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
0a00: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
0a10: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
0a20: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
0a30: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
0a40: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
0a50: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
0a60: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
0a70: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
0a80: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
0a90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
0ab0: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
0ac0: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
0ad0: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
0ae0: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
0af0: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
0b00: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
0b10: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
0b20: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
0b30: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
0b40: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0b50: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0b60: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0b70: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0b80: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0b90: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
0ba0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0bb0: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0bc0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0bd0: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0be0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0bf0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0c00: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0c10: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0c20: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0c30: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0c40: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0c50: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0c60: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0c70: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0c80: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0c90: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0ca0: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0cb0: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0cc0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0cd0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ce0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0cf0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0d00: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
0d10: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
0d20: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
0d30: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
0d40: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
0d50: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
0d60: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
0d70: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
0d80: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
0d90: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
0da0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
0db0: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
0dc0: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
0dd0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
0de0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0df0: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
0e00: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
0e10: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
0e20: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0e30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
0e40: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e60: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
0e70: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
0e80: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
0e90: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
0ea0: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
0eb0: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
0ec0: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
0ed0: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
0ee0: 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
0ef0: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f00: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0f10: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0f20: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0f40: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0f50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
0f60: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
0f70: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
0f90: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
0fa0: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
0fb0: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
0fc0: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0fe0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
0ff0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
1000: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
1010: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
1020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
1030: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
1040: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
1050: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
1060: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
1070: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
1080: 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61  mation if eOpera
1090: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20  tor==WO_OR */.  
10a0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
10b0: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
10c0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
10d0: 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  f eOperator==WO_
10e0: 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  AND */.  } u;.  
10f0: 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  u16 eOperator;  
1100: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f          /* A WO_
1110: 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  xx value describ
1120: 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38  ing <op> */.  u8
1130: 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20   wtFlags;       
1140: 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78        /* TERM_xx
1150: 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65  x bit flags.  Se
1160: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20  e below */.  u8 
1170: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
1180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1190: 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20  f children that 
11a0: 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20  must disable us 
11b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11c0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20   *pWC;       /* 
11d0: 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20  The clause this 
11e0: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
11f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
1200: 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20  reqRight;    /* 
1210: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
1220: 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d  s used by pExpr-
1230: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
1240: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
1250: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
1260: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
1270: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
1280: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1290: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65  ed values of Whe
12a0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a  reTerm.wtFlags.*
12b0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
12c0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
12d0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
12e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f  te(db, pExpr) */
1300: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
1310: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
1320: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
1330: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
1340: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
1350: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
1360: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
1370: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
1380: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
1390: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
13a0: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
13b0: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
13c0: 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  ine TERM_ORINFO 
13d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65      0x10   /* Ne
13e0: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
13f0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
1400: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65  fo object */.#de
1410: 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46  fine TERM_ANDINF
1420: 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e  O    0x20   /* N
1430: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64  WhereTerm.u.pAnd
1450: 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66  Info obj */.#def
1460: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
1470: 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73      0x40   /* Us
1480: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
1490: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
14a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
14b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
14c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
14d0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
14e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
14f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1500: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1510: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1520: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1530: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1540: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1570: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1580: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
1590: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15a0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
15b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
15c0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
15d0: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15f0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1600: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1610: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1620: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1630: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1640: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
1650: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
1660: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1680: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1690: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16c0: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
16d0: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
16e0: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
16f0: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1700: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1710: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1720: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1730: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1740: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
1750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1760: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1770: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1780: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1790: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17a0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
17b0: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
17c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
17d0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17e0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17f0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1800: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1810: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1820: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1830: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1840: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1850: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1860: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1870: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1880: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1890: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
18b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
18c0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
18d0: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18e0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1900: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1910: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1920: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1930: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1940: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1950: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1960: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1970: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1980: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1990: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19a0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
19c0: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
19d0: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a10: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a20: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a40: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a50: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a60: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a80: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a90: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1aa0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1ab0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1ac0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1ad0: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1ae0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1af0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b00: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b10: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b20: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b30: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b40: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b50: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b60: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b70: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b80: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b90: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1ba0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1bb0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1bc0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1bd0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1be0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bf0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c00: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c10: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c20: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c50: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c60: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c70: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c80: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c90: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1ca0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1cb0: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1cc0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1cd0: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ce0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cf0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d00: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d20: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d30: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d40: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d50: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d80: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d90: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1da0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1db0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1dc0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1dd0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1de0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1df0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e00: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e20: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e30: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e40: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e60: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e70: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e80: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e90: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ea0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1eb0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1ec0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1ed0: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ee0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f10: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f20: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f30: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f50: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f60: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f70: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f80: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f90: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1fa0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1fb0: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1fc0: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1fd0: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fe0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1ff0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2000: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2010: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2020: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2030: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2040: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2050: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2060: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  y */.  double nR
2070: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2080: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2090: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
20a0: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20    Bitmask used; 
20b0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
20c0: 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  of cursors used 
20d0: 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a  by this plan */.
20e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
20f0: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
2100: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
2110: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
2120: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
2130: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
2140: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
2150: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
2160: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
2170: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
2180: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
2190: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
21a0: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
21b0: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
21c0: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
21d0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
21e0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21f0: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2200: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2210: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
2220: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2230: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
2240: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
2250: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
2260: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
2270: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
2280: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
2290: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
22a0: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
22b0: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
22c0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
22d0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
22e0: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
22f0: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2300: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2310: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
2320: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
2330: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
2340: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
2350: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
2360: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47  .#define WO_SING
2370: 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f  LE 0x0ff       /
2380: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f  * Mask of all no
2390: 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20  n-compound WO_* 
23a0: 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  values */../*.**
23b0: 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61   Value for wsFla
23c0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
23d0: 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73  estIndex() and s
23e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72  tored in.** Wher
23f0: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20  eLevel.wsFlags. 
2400: 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74   These flags det
2410: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61  ermine which sea
2420: 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65  rch.** strategie
2430: 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
2440: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61  e..**.** The lea
2450: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
2460: 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76  2 bits is reserv
2470: 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72  ed as a mask for
2480: 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76   WO_ values abov
2490: 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c  e..** The WhereL
24a0: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
24b0: 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65  ld is usually se
24c0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
24d0: 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42  |WO_ISNULL..** B
24e0: 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ut if the table 
24f0: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
2500: 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  le of a left joi
2510: 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  n, WhereLevel.ws
2520: 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  Flags.** is set 
2530: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
2540: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2550: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61  wsFlags field ca
2560: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
2570: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
2580: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
2590: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
25a0: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
25b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
25c0: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
25d0: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
25e0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
25f0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2600: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
2610: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
2620: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
2630: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
2640: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30  ID_EQ     0x0000
2650: 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45  1000  /* rowid=E
2660: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
2670: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
2680: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2690: 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20  GE  0x00002000  
26a0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
26b0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
26d0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
26e0: 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45  00010000  /* x=E
26f0: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
2700: 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a  ) or x IS NULL *
2710: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2720: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
2730: 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0020000  /* x<EX
2740: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
2750: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2760: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
2770: 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20  x00040000  /* x 
2780: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
2790: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
27a0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30  _NULL  0x0008000
27b0: 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  0  /* x IS NULL 
27c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
27d0: 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78  _INDEXED      0x
27e0: 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79  000f0000  /* Any
27f0: 74 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20  thing that uses 
2800: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66  an index */.#def
2810: 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  ine WHERE_NOT_FU
2820: 4c 4c 53 43 41 4e 20 30 78 30 30 30 66 33 30 30  LLSCAN 0x000f300
2830: 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64  0  /* Does not d
2840: 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  o a full table s
2850: 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  can */.#define W
2860: 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20  HERE_IN_ABLE    
2870: 20 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a    0x000f1000  /*
2880: 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74   Able to support
2890: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
28a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
28b0: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
28c0: 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45  00100000  /* x<E
28d0: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
28e0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
28f0: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
2900: 49 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30  IMIT    0x002000
2910: 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  00  /* x>EXPR or
2920: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
2930: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
2940: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
2950: 20 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a    0x00800000  /*
2960: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
2970: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
2980: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
2990: 44 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30  DERBY      0x010
29a0: 30 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74  00000  /* Output
29b0: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
29c0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
29d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
29e0: 45 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32  EVERSE      0x02
29f0: 30 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20  000000  /* Scan 
2a00: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
2a10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2a20: 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30  E_UNIQUE       0
2a30: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65  x04000000  /* Se
2a40: 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68  lects no more th
2a50: 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64  an one row */.#d
2a60: 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54  efine WHERE_VIRT
2a70: 55 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30  UALTABLE 0x08000
2a80: 30 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74  000  /* Use virt
2a90: 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73  ual-table proces
2aa0: 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  sing */.#define 
2ab0: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
2ac0: 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f     0x10000000  /
2ad0: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
2ae0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
2af0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d  define WHERE_TEM
2b00: 50 5f 49 4e 44 45 58 20 20 20 30 78 32 30 30 30  P_INDEX   0x2000
2b10: 30 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  0000  /* Uses an
2b20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2b30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
2b40: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
2b50: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
2b60: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2b70: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2b80: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
2b90: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
2bb0: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
2bc0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2bd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bf0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2c00: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2c10: 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f  et *pMaskSet   /
2c20: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
2c30: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
2c40: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
2c50: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
2c60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2c70: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
2c80: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
2c90: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
2ca0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
2cb0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
2cc0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
2cd0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
2ce0: 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d  WC->vmask = 0;.}
2cf0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2d00: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2d10: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2d20: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2d30: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2d40: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2d50: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2d60: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2d70: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2d80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2d90: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2da0: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2db0: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2dc0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2dd0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2de0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2df0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2e00: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2e10: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2e20: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e40: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2e50: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2e60: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2e70: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2e80: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2e90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2ea0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2eb0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2ec0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2ed0: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2ee0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2ef0: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2f00: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2f10: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2f20: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2f30: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2f40: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2f50: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2f60: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2f70: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2f80: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2f90: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2fa0: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2fb0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2fc0: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2fd0: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2fe0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2ff0: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
3000: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3010: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
3020: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
3030: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
3040: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
3050: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
3060: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3070: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
3080: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
3090: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
30a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
30b0: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
30c0: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
30d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30e0: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
30f0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
3100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3110: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
3120: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
3130: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3140: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
3150: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3160: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
3170: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
3180: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3190: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
31a0: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
31b0: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
31c0: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
31d0: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
31e0: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
31f0: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
3200: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
3210: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
3220: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
3230: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
3240: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3250: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
3260: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
3270: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
3280: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
32a0: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
32b0: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
32c0: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
32d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32e0: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
32f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3300: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
3310: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
3320: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
3330: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
3340: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
3350: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
3360: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
3370: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
3380: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3390: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
33a0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
33b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
33c0: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
33d0: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
33e0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
33f0: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
3400: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
3410: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
3420: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
3430: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
3440: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
3450: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
3460: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
3470: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
3480: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
34a0: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
34b0: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
34c0: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
34d0: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
34e0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
34f0: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
3500: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
3510: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3520: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
3530: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3540: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
3550: 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c    testcase( wtFl
3560: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
3570: 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  AL );  /* EV: R-
3580: 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20  00211-15100 */. 
3590: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
35a0: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
35b0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
35c0: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
35d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
35e0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
35f0: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
3600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
3610: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
3620: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
3630: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
3640: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
3650: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
3660: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
3670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
3680: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
3690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
36a0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
36b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
36c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
36d0: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
36e0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
36f0: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
3700: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
3710: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
3720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3730: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
3740: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
3750: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
3760: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
3770: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
3780: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
3790: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
37a0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
37b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pTerm->pExpr = p
37c0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
37d0: 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20  gs = wtFlags;.  
37e0: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
37f0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
3800: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
3810: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
3820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
3830: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
3840: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
3850: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
3860: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
3870: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
3880: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
3890: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
38a0: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
38b0: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
38c0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
38d0: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
38e0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
38f0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
3900: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
3910: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
3920: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
3930: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
3940: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
3950: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
3960: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
3970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
3980: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
3990: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
39a0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
39b0: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
39c0: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
39d0: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
39f0: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
3a00: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
3a10: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
3a20: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
3a30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3a40: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
3a50: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
3a60: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
3a70: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
3a80: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
3a90: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
3aa0: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
3ab0: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
3ac0: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
3ad0: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
3ae0: 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20  ay.  The slot[] 
3af0: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
3b00: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
3b10: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
3b20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3b40: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
3b50: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3b60: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
3b70: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
3b80: 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70   (u8)op;.  if( p
3b90: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
3ba0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
3bb0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
3bc0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
3bd0: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
3be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
3bf0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3c00: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
3c10: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
3c20: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
3c30: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
3c40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
3c50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  n expression mas
3c60: 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d 61  k set (a WhereMa
3c70: 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f  skSet object).*/
3c80: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
3c90: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
3ca0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
3cb0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
3cc0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
3cd0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
3ce0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
3cf0: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
3d00: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
3d10: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
3d20: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68  tmask getMask(Wh
3d30: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
3d40: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
3d50: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
3d60: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
3d70: 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61  >n<=sizeof(Bitma
3d80: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
3d90: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
3da0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
3db0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
3dc0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
3dd0: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
3de0: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
3df0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3e10: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
3e20: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
3e30: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
3e40: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
3e50: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
3e60: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
3e70: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
3e80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3e90: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
3ea0: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
3eb0: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
3ec0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
3ed0: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
3ee0: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
3ef0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
3f00: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
3f10: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
3f20: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
3f30: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
3f40: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
3f50: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
3f60: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
3f70: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
3f80: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
3f90: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
3fa0: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
3fb0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
3fc0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
3fd0: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
3fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3ff0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a   and generates.*
4000: 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  * a bitmask indi
4010: 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62  cating which tab
4020: 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  les are used in 
4030: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  that expression.
4040: 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  ** tree..**.** I
4050: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
4060: 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b   routine to work
4070: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
4080: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
4090: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69  .** previously i
40a0: 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65  nvoked sqlite3Re
40b0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
40c0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
40d0: 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  on.  See.** the 
40e0: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
40f0: 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
4100: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
4110: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  formation..** Th
4120: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  e sqlite3Resolve
4130: 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74  ExprNames() rout
4140: 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63  ines looks for c
4150: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a  olumn names and.
4160: 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70  ** sets their op
4170: 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55  codes to TK_COLU
4180: 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70  MN and their Exp
4190: 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20  r.iTable fields 
41a0: 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63  to.** the VDBE c
41b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
41c0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
41d0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
41e0: 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  s to.** translat
41f0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
4200: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73  bers into bitmas
4210: 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20  k values and OR 
4220: 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61  all.** the bitma
4230: 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f  sks together..*/
4240: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4250: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4260: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4270: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
4280: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
4290: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
42a0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
42b0: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
42c0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
42d0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
42e0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
42f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
4300: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
4310: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4320: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
4330: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
4340: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
4350: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
4360: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
4370: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
4380: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
4390: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
43a0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
43b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
43c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
43d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
43e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
43f0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
4400: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
4410: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4420: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4430: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
4440: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
4450: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
4460: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4470: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
4480: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4490: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
44a0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
44b0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
44c0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
44d0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
44e0: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
44f0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
4500: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
4510: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
4520: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4530: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
4540: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4550: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
4560: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
4570: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4580: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4590: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
45a0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
45b0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
45c0: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
45d0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
45e0: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
45f0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4600: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4610: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
4620: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
4630: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4640: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4650: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
4660: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
4670: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4680: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
4690: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
46a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
46c0: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
46d0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
46e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
46f0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53  pHaving);.    pS
4700: 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20   = pS->pPrior;. 
4710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4730: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
4740: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
4750: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
4760: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
4770: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
4780: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
4790: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
47a0: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
47b0: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
47c0: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
47d0: 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a  >=", and "IN"..*
47e0: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
47f0: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
4800: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
4810: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
4820: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
4830: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
4840: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
4850: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
4860: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
4870: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
4880: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
4890: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
48a0: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
48b0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
48c0: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
48d0: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
48e0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
48f0: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
4900: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
4910: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
4920: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
4930: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
4940: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
4950: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
4960: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
4970: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
4980: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
4990: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
49a0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
49b0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
49c0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
49d0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
49e0: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
49f0: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
4a00: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
4a10: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
4a20: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
4a30: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
4a40: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
4a50: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
4a60: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
4a70: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
4a80: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
4a90: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
4aa0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
4ab0: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
4ac0: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
4ad0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
4ae0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
4af0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
4b00: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
4b10: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
4b20: 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69  .** If a collati
4b30: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  on sequence is a
4b40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
4b50: 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f  ither the left o
4b60: 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20  r right.** side 
4b70: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4b80: 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73  n, it remains as
4b90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4ba0: 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65  e same side afte
4bb0: 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61  r.** the commuta
4bc0: 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c  tion. So "Y coll
4bd0: 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22  ate NOCASE op X"
4be0: 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20   becomes .** "X 
4bf0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
4c00: 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65  p Y". This is be
4c10: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
4c20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
4c30: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
4c40: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
4c50: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
4c60: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
4c70: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
4c80: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
4c90: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
4ca0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70  eason the EP_Exp
4cb0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20  Collate flag.** 
4cc0: 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e  is not commuted.
4cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ce0: 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73  exprCommute(Pars
4cf0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
4d00: 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65  *pExpr){.  u16 e
4d10: 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72  xpRight = (pExpr
4d20: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4d30: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4d40: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
4d50: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
4d60: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
4d70: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
4d80: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
4d90: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
4da0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
4db0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
4dc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
4dd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
4de0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
4df0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
4e00: 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  t->pColl = sqlit
4e10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
4e20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
4e30: 66 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c  ft);.  SWAP(Coll
4e40: 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  Seq*,pExpr->pRig
4e50: 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d  ht->pColl,pExpr-
4e60: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a  >pLeft->pColl);.
4e70: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d    pExpr->pRight-
4e80: 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d  >flags = (pExpr-
4e90: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
4ea0: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
4eb0: 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45   | expLeft;.  pE
4ec0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4ed0: 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  s = (pExpr->pLef
4ee0: 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45  t->flags & ~EP_E
4ef0: 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70  xpCollate) | exp
4f00: 52 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78  Right;.  SWAP(Ex
4f10: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
4f20: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
4f30: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
4f40: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
4f50: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
4f60: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
4f70: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
4f80: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
4f90: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
4fa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4fb0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
4fc0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4fd0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
4fe0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
4ff0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
5000: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
5010: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
5020: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
5030: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
5040: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
5050: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
5060: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
5070: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
5080: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
5090: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
50a0: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
50b0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
50c0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
50d0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
50e0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
50f0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
5100: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
5110: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
5120: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
5130: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
5140: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
5150: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5160: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
5170: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
5180: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
5190: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
51a0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
51b0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
51c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
51d0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
51e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
51f0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
5200: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
5210: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
5220: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
5230: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
5240: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
5250: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
5260: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
5270: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
5280: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
5290: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
52a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
52b0: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
52c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
52d0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
52e0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
52f0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
5300: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
5310: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
5320: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
5330: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
5340: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
5350: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
5360: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
5370: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
5380: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
5390: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
53a0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
53b0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
53c0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
53d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
53e0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
53f0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
5400: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
5410: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
5420: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
5430: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
5440: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
5450: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
5460: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
5470: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
5480: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
5490: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
54a0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
54b0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
54c0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
54d0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
54e0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
54f0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
5500: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
5510: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
5520: 20 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   k;.  assert( iC
5530: 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d  ur>=0 );.  op &=
5540: 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70   WO_ALL;.  for(p
5550: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
5560: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
5570: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
5580: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5590: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
55a0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
55b0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
55c0: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
55d0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
55e0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
55f0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
5600: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f  m->eOperator & o
5610: 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  p)!=0.    ){.   
5620: 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 70     if( pIdx && p
5630: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
5640: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
5650: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
5660: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
5670: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
5680: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  pColl;.        c
5690: 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20  har idxaff;.    
56a0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
56b0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
56c0: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
56d0: 0a 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20  .        idxaff 
56e0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
56f0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
5700: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
5710: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
5720: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
5730: 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e  idxaff) ) contin
5740: 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ue;..        /* 
5750: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63  Figure out the c
5760: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
5770: 65 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  e required from 
5780: 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20  an index for.   
5790: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
57a0: 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69   useful for opti
57b0: 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f  mising expressio
57c0: 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73  n pX. Store this
57d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
57e0: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
57f0: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  oll..        */.
5800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5810: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
5820: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
5830: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
5840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5850: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
5860: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61  ight);.        a
5870: 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70  ssert(pColl || p
5880: 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20  Parse->nErr);.. 
5890: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
58a0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
58b0: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
58c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
58d0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
58e0: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
58f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
5900: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
5910: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
5920: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
5930: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
5940: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5950: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
5960: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  n pTerm;.    }. 
5970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5980: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
5990: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
59a0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
59b0: 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72  e(SrcList*, Wher
59c0: 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a  eClause*, int);.
59d0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72  ./*.** Call expr
59e0: 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74  Analyze on all t
59f0: 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20  erms in a WHERE 
5a00: 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a  clause.  .**.**.
5a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a20: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20  xprAnalyzeAll(. 
5a30: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
5a40: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65  st,       /* the
5a50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
5a60: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
5a70: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
5a80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
5a90: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
5aa0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
5ab0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
5ac0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5ad0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
5ae0: 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29  TabList, pWC, i)
5af0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5b00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5b10: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
5b20: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
5b30: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
5b40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
5b50: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
5b60: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
5b70: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
5b80: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
5b90: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
5ba0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
5bb0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
5bc0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
5bd0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
5be0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
5bf0: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
5c00: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
5c10: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
5c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
5c30: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
5c40: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
5c50: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
5c60: 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ob(.  Parse *pPa
5c70: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
5c80: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5c90: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5ca0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
5cb0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5cc0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5cd0: 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66  .  Expr **ppPref
5ce0: 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ix,  /* Pointer 
5cf0: 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70  to TK_STRING exp
5d00: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74  ression with pat
5d10: 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20  tern prefix */. 
5d20: 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74   int *pisComplet
5d30: 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  e, /* True if th
5d40: 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20  e only wildcard 
5d50: 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74  is % in the last
5d60: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
5d70: 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20  int *pnoCase    
5d80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
5d90: 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61  ercase is equiva
5da0: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
5db0: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
5dc0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20  char *z = 0;    
5dd0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f       /* String o
5de0: 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70  n RHS of LIKE op
5df0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5e00: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
5e10: 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ;      /* Right 
5e20: 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66  and left size of
5e30: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5e40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
5e50: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
5e60: 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e  * List of operan
5e70: 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f  ds to the LIKE o
5e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
5e90: 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63          /* One c
5eb0: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20  haracter in z[] 
5ec0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  /* Number of non
5ef0: 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78  -wildcard prefix
5f00: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5f10: 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20   char wc[3];    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5f30: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
5f40: 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
5f50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5f60: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
5f70: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73  onnection */.  s
5f80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
5f90: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70  al = 0;.  int op
5fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fb0: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f       /* Opcode o
5fc0: 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69  f pRight */..  i
5fd0: 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b  f( !sqlite3IsLik
5fe0: 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  eFunction(db, pE
5ff0: 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63  xpr, pnoCase, wc
6000: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6010: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
6020: 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66  LITE_EBCDIC.  if
6030: 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74  ( *pnoCase ) ret
6040: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
6050: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
6060: 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20  .pList;.  pLeft 
6070: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
6080: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
6090: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
60a0: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
60b0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
60c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
60d0: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
60e0: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
60f0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
6100: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
6110: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
6120: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
6130: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
6140: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
6150: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
6160: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6170: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
6180: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
6190: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
61a0: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
61b0: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
61c0: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
61d0: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
61e0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
61f0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
6200: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
6210: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
6220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
6230: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
6240: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
6250: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
6260: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
6270: 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
6280: 28 70 52 65 70 72 65 70 61 72 65 2c 20 70 52 69  (pReprepare, pRi
6290: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 53 51  ght->iColumn, SQ
62a0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
62b0: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
62c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
62d0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
62e0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
62f0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
6300: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
6310: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
6320: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
6330: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
6340: 62 65 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  be, pRight->iCol
6350: 75 6d 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  umn);.    assert
6360: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
6370: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69  _VARIABLE || pRi
6380: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  ght->op==TK_REGI
6390: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20  STER );.  }else 
63a0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  if( op==TK_STRIN
63b0: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69  G ){.    z = pRi
63c0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
63d0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20   }.  if( z ){.  
63e0: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
63f0: 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29  hile( (c=z[cnt])
6400: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
6410: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
6420: 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20  !=wc[2] ){.     
6430: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   cnt++;.    }.  
6440: 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20    if( cnt!=0 && 
6450: 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31  255!=(u8)z[cnt-1
6460: 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ] ){.      Expr 
6470: 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20  *pPrefix;.      
6480: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63  *pisComplete = c
6490: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
64a0: 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50  +1]==0;.      pP
64b0: 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45  refix = sqlite3E
64c0: 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e  xpr(db, TK_STRIN
64d0: 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  G, z);.      if(
64e0: 20 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66   pPrefix ) pPref
64f0: 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74  ix->u.zToken[cnt
6500: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70  ] = 0;.      *pp
6510: 50 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78  Prefix = pPrefix
6520: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
6530: 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20  TK_VARIABLE ){. 
6540: 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
6550: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6570: 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c  dbeSetVarmask(v,
6580: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
6590: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
65a0: 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70  pisComplete && p
65b0: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
65c0: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
65d0: 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66  /* If the rhs of
65e0: 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73   the LIKE expres
65f0: 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62  sion is a variab
6600: 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  le, and the curr
6610: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ent.          **
6620: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61   value of the va
6630: 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65  riable means the
6640: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6650: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45   invoke the LIKE
6660: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
6670: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20  nction, then no 
6680: 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c  OP_Variable will
6690: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
66a0: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20   program..      
66b0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73      ** This caus
66c0: 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  es problems for 
66d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
66e0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
66f0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ).          ** A
6700: 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e  PI. To workaroun
6710: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
6720: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
6730: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
6740: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
6750: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
6760: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6770: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6780: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
6790: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
67a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
67b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
67c0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
67d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
67e0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
67f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6800: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6810: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
6820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6830: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
6840: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
6850: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
6860: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
6870: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
6880: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
6890: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
68a0: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
68b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
68c0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
68d0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
68e0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
68f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
6900: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
6910: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
6920: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
6930: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
6940: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
6950: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
6960: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
6970: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
6980: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
6990: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
69a0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
69b0: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
69c0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
69d0: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
69e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
69f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6a00: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
6a10: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
6a20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6a30: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
6a40: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
6a50: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
6a60: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
6a70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
6a80: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
6a90: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
6aa0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
6ab0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6ac0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
6ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6ae0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
6af0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
6b00: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
6b10: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
6b20: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
6b30: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
6b40: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
6b50: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
6b60: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
6b70: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
6b80: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
6b90: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
6ba0: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
6bb0: 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65  Base){.  pDerive
6bc0: 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73  d->flags |= pBas
6bd0: 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72  e->flags & EP_Fr
6be0: 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76  omJoin;.  pDeriv
6bf0: 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  ed->iRightJoinTa
6c00: 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69  ble = pBase->iRi
6c10: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a  ghtJoinTable;.}.
6c20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6c30: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
6c40: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6c50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6c60: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6c70: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6c80: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6c90: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6ca0: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6cb0: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6cc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
6cd0: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
6ce0: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
6cf0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
6d00: 2a 2a 20 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 5e 5e 5e 5e              ^^^^
6d20: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6d30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6d40: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6d50: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6d60: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6d70: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6d80: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6d90: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6da0: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6db0: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6dc0: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
6dd0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
6de0: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
6df0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
6e00: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
6e10: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
6e20: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
6e30: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
6e40: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6e50: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6e60: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6e70: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6e80: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6e90: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6ea0: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6eb0: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6ec0: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
6ed0: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
6ee0: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
6ef0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
6f00: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
6f10: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
6f20: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
6f30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
6f40: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6f50: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6f60: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6f70: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6f80: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6f90: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6fa0: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6fb0: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6fc0: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
6fd0: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
6fe0: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
6ff0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
7000: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
7010: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
7020: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
7030: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
7040: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
7050: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
7060: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
7070: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
7080: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
7090: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
70a0: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
70b0: 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67  n of C.** a sing
70c0: 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73  le table T (as s
70d0: 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20  hown in example 
70e0: 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72  B above) then cr
70f0: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
7100: 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20  al.** term that 
7110: 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  is an equivalent
7120: 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20   IN expression. 
7130: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
7140: 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20   if the term.** 
7150: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69  being analyzed i
7160: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
7170: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
7180: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
7190: 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  expr3.**.** then
71a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
71b0: 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20  rtual term like 
71c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
71d0: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
71e0: 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20  r2,expr3).**.** 
71f0: 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 2:.**.** If
7200: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
7210: 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61  e indexable by a
7220: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c   single table T,
7230: 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20   then set.**.** 
7240: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f      WhereTerm.eO
7250: 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20  perator         
7260: 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a       =  WO_OR.**
7270: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
7280: 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
7290: 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72  ble  |=  the cur
72a0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
72b0: 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73  able T.**.** A s
72c0: 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78  ubterm is "index
72d0: 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f  able" if it is o
72e0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54  f the form.** "T
72f0: 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  .C <op> <expr>" 
7300: 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63  where C is any c
7310: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54  olumn of table T
7320: 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73   and .** <op> is
7330: 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22   one of "=", "<"
7340: 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d  , "<=", ">", ">=
7350: 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72  ", "IS NULL", or
7360: 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74   "IN"..** A subt
7370: 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65  erm is also inde
7380: 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61  xable if it is a
7390: 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20  n AND of two or 
73a0: 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65  more.** subsubte
73b0: 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  rms at least one
73c0: 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64   of which is ind
73d0: 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62  exable.  Indexab
73e0: 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65  le AND .** subte
73f0: 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65  rms have their e
7400: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20  Operator set to 
7410: 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20  WO_AND and they 
7420: 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e  have.** u.pAndIn
7430: 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61  fo set to a dyna
7440: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
7450: 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f  d WhereAndTerm o
7460: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f  bject..**.** Fro
7470: 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20  m another point 
7480: 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61  of view, "indexa
7490: 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20  ble" means that 
74a0: 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c  the subterm coul
74b0: 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79  d.** potentially
74c0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
74d0: 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70   index if an app
74e0: 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65  ropriate index e
74f0: 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61  xists..** This a
7500: 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74  nalysis does not
7510: 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65   consider whethe
7520: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64  r or not the ind
7530: 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a  ex exists; that.
7540: 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  ** is something 
7550: 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  the bestIndex() 
7560: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74  routine will det
7570: 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e  ermine.  This an
7580: 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c  alysis.** only l
7590: 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20  ooks at whether 
75a0: 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72  subterms appropr
75b0: 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  iate for indexin
75c0: 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  g exist..**.** A
75d0: 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68  ll examples A th
75e0: 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c  rough E above al
75f0: 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  l satisfy case 2
7600: 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d  .  But if a term
7610: 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66  .** also statisf
7620: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
7630: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
7640: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
7650: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
7660: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
7670: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
7680: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
7690: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
76a0: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
76b0: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
76c0: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
76d0: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
76e0: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
76f0: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
7700: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
7710: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
7720: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
7730: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
7740: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
7750: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
7760: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
7770: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
7780: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
7790: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
77a0: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
77b0: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
77c0: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
77d0: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
77e0: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
77f0: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
7800: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
7810: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
7820: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
7830: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
7840: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
7850: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
7860: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
7870: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
7880: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
7890: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
78a0: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
78b0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
78c0: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
78d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
78e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
78f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7900: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7910: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
7920: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
7930: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
7940: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7960: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
7970: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7980: 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
7990: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
79a0: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
79b0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
79c0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
79d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79f0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
7a00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
7a10: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7a20: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7a30: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7a40: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7a50: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7a60: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7a80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7a90: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68  the term */.  Wh
7aa0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
7ab0: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
7ac0: 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75  kSet; /* Table u
7ad0: 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e  se masks */.  in
7ae0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t 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 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7b10: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
7b20: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
7b30: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
7b40: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
7b50: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7b60: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7b70: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7b80: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7b90: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7ba0: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7bb0: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7bc0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7bd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7be0: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7bf0: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
7c00: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
7c10: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
7c20: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
7c30: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
7c40: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
7c50: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
7c60: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
7c70: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
7c80: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
7c90: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
7ca0: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
7cb0: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
7cc0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
7cd0: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
7ce0: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
7cf0: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
7d00: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
7d10: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
7d20: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
7d30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
7d40: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
7d50: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
7d60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7d70: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
7d80: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
7d90: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
7da0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
7db0: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
7dc0: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
7dd0: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
7de0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7df0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
7e00: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
7e10: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
7e20: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
7e30: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
7e40: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
7e50: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
7e60: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
7e70: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
7e80: 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  MaskSet);.  wher
7e90: 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45  eSplit(pOrWc, pE
7ea0: 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65  xpr, TK_OR);.  e
7eb0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
7ec0: 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66  rc, pOrWc);.  if
7ed0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7ee0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
7ef0: 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54  ssert( pOrWc->nT
7f00: 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a  erm>=2 );..  /*.
7f10: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
7f20: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
7f30: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
7f40: 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a  y cases 1 or 2..
7f50: 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65    */.  indexable
7f60: 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
7f70: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 70    chngToIN = ~(p
7f80: 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66 6f  WC->vmask);.  fo
7f90: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
7fa0: 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57  -1, pOrTerm=pOrW
7fb0: 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e  c->a; i>=0 && in
7fc0: 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f  dexable; i--, pO
7fd0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  rTerm++){.    if
7fe0: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
7ff0: 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c  rator & WO_SINGL
8000: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  E)==0 ){.      W
8010: 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e  hereAndInfo *pAn
8020: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  dInfo;.      ass
8030: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
8040: 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20  perator==0 );.  
8050: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72      assert( (pOr
8060: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
8070: 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45  (TERM_ANDINFO|TE
8080: 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29  RM_ORINFO))==0 )
8090: 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e  ;.      chngToIN
80a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64   = 0;.      pAnd
80b0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
80c0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
80d0: 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29  zeof(*pAndInfo))
80e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  ;.      if( pAnd
80f0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
8100: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
8110: 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65  dWC;.        Whe
8120: 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d  reTerm *pAndTerm
8130: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
8140: 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
8150: 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   b = 0;.        
8160: 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49  pOrTerm->u.pAndI
8170: 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a  nfo = pAndInfo;.
8180: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8190: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
81a0: 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20  _ANDINFO;.      
81b0: 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72    pOrTerm->eOper
81c0: 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20  ator = WO_AND;. 
81d0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20         pAndWC = 
81e0: 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  &pAndInfo->wc;. 
81f0: 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75         whereClau
8200: 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70  seInit(pAndWC, p
8210: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73  WC->pParse, pMas
8220: 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 77  kSet);.        w
8230: 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43  hereSplit(pAndWC
8240: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
8250: 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20  , TK_AND);.     
8260: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c     exprAnalyzeAl
8270: 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b  l(pSrc, pAndWC);
8280: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
8290: 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e( db->mallocFai
82a0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
82b0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
82c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
82d0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54    for(j=0, pAndT
82e0: 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a  erm=pAndWC->a; j
82f0: 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20  <pAndWC->nTerm; 
8300: 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29  j++, pAndTerm++)
8310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
8320: 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e  sert( pAndTerm->
8330: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
8340: 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64       if( allowed
8350: 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78  Op(pAndTerm->pEx
8360: 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20  pr->op) ){.     
8370: 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65           b |= ge
8380: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
8390: 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pAndTerm->leftCu
83a0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rsor);.         
83b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
83c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
83d0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
83e0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
83f0: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
8400: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8410: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20  _COPIED ){.     
8420: 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65   /* Skip this te
8430: 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20  rm for now.  We 
8440: 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20  revisit it when 
8450: 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20  we process the. 
8460: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f       ** correspo
8470: 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55  nding TERM_VIRTU
8480: 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d  AL term */.    }
8490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d  else{.      Bitm
84a0: 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  ask b;.      b =
84b0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
84c0: 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t, pOrTerm->left
84d0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
84e0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  f( pOrTerm->wtFl
84f0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
8500: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  AL ){.        Wh
8510: 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
8520: 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54  = &pOrWc->a[pOrT
8530: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20  erm->iParent];. 
8540: 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d         b |= getM
8550: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
8560: 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72  ther->leftCursor
8570: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8580: 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b   indexable &= b;
8590: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
85a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
85b0: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20  O_EQ ){.        
85c0: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
85d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
85e0: 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62     chngToIN &= b
85f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8600: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
8610: 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66  ecord the set of
8620: 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61 74   tables that sat
8630: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54 68  isfy case 2.  Th
8640: 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20  e set might be. 
8650: 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   ** empty..  */.
8660: 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78    pOrInfo->index
8670: 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65  able = indexable
8680: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
8690: 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65  ator = indexable
86a0: 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b  ==0 ? 0 : WO_OR;
86b0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67  ..  /*.  ** chng
86c0: 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74  ToIN holds a set
86d0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
86e0: 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79 20  *might* satisfy 
86f0: 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a  case 1.  But.  *
8700: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20  * we have to do 
8710: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
8720: 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20  checking to see 
8730: 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79  if case 1 really
8740: 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69  .  ** is satisfi
8750: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68  ed..  **.  ** ch
8760: 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64  ngToIN will hold
8770: 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72   either 0, 1, or
8780: 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d   2 bits.  The 0-
8790: 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20  bit case means. 
87a0: 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69   ** that there i
87b0: 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79  s no possibility
87c0: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
87d0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
87e0: 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f  nto an.  ** IN o
87f0: 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20  perator because 
8800: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  one or more term
8810: 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  s in the OR clau
8820: 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20  se contain.  ** 
8830: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
8840: 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c  than == on a col
8850: 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c  umn in the singl
8860: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d  e table.  The 1-
8870: 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65  bit.  ** case me
8880: 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20 74  ans that every t
8890: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c  erm of the OR cl
88a0: 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20 66  ause is of the f
88b0: 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e  orm.  ** "table.
88c0: 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72  column=expr" for
88d0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62   some single tab
88e0: 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74  le.  The one bit
88f0: 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a   that is set.  *
8900: 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e  * will correspon
8910: 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  d to the common 
8920: 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c  table.  We still
8930: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74   need to check t
8940: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  o make.  ** sure
8950: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
8960: 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20   is used on all 
8970: 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69  terms.  The 2-bi
8980: 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20  t case is when. 
8990: 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d   ** the all term
89a0: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
89b0: 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e  m "table1.column
89c0: 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e  =table2.column".
89d0: 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20    It.  ** might 
89e0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  be possible to f
89f0: 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  orm an IN operat
8a00: 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20 74  or with either t
8a10: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a  able1.column.  *
8a20: 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75  * or table2.colu
8a30: 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69 66  mn as the LHS if
8a40: 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f   either is commo
8a50: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
8a60: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63  of.  ** the OR c
8a70: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
8a80: 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73   Note that terms
8a90: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
8aa0: 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c  ble.column1=tabl
8ab0: 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a  e.column2" (the.
8ac0: 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20    ** same table 
8ad0: 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66  on both sizes of
8ae0: 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20   the ==) cannot 
8af0: 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20  be optimized..  
8b00: 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49  */.  if( chngToI
8b10: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54  N ){.    int okT
8b20: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20  oChngToIN = 0;  
8b30: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
8b40: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  e conversion to 
8b50: 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  IN is valid */. 
8b60: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d     int iColumn =
8b70: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
8b80: 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20  Column index on 
8b90: 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  lhs of IN operat
8ba0: 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  or */.    int iC
8bb0: 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20  ursor = -1;     
8bc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
8bd0: 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  sor common to al
8be0: 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  l terms */.    i
8bf0: 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20  nt j = 0;       
8c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8c10: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
8c20: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
8c30: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8c40: 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  n that appears o
8c50: 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68  n one side or th
8c60: 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f  e.    ** other o
8c70: 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f  f the == operato
8c80: 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74 65  r in every subte
8c90: 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20  rm.  That table 
8ca0: 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  and column.    *
8cb0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  * will be record
8cc0: 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e  ed in iCursor an
8cd0: 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72  d iColumn.  Ther
8ce0: 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
8cf0: 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74  ny.    ** such t
8d00: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
8d10: 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    Set okToChngTo
8d20: 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  IN if an appropr
8d30: 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a  iate table.    *
8d40: 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20  * and column is 
8d50: 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20  found but leave 
8d60: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c  okToChngToIN fal
8d70: 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  se if not found.
8d80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
8d90: 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54  j=0; j<2 && !okT
8da0: 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b  oChngToIN; j++){
8db0: 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d  .      pOrTerm =
8dc0: 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20   pOrWc->a;.     
8dd0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
8de0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
8df0: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
8e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8e10: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8e20: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
8e30: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8e40: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
8e50: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OK;.        if( 
8e60: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
8e70: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  sor==iCursor ){.
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
8e90: 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63  s is the 2-bit c
8ea0: 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f  ase and we are o
8eb0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  n the second ite
8ec0: 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  ration and.     
8ed0: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20       ** current 
8ee0: 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65  term is from the
8ef0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
8f00: 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20  .  So skip this 
8f10: 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  term. */.       
8f20: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
8f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
8f40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
8f50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68  .        if( (ch
8f60: 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b  ngToIN & getMask
8f70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65  (pMaskSet, pOrTe
8f80: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29  rm->leftCursor))
8f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8fa0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75   /* This term mu
8fb0: 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
8fc0: 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65  m t1.a==t2.b whe
8fd0: 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a  re t2 is in the.
8fe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e            ** chn
8ff0: 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31  gToIN set but t1
9000: 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74   is not.  This t
9010: 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68  erm will be eith
9020: 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20  er preceeded.   
9030: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c         ** or fol
9040: 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72  lwed by an inver
9050: 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d  ted copy (t2.b==
9060: 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69  t1.a).  Skip thi
9070: 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20  s term .        
9080: 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73    ** and use its
9090: 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20   inversion. */. 
90a0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
90b0: 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  e( pOrTerm->wtFl
90c0: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
90d0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  D );.          t
90e0: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
90f0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9100: 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
9110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
9120: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9130: 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45   (TERM_COPIED|TE
9140: 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20  RM_VIRTUAL) );. 
9150: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9160: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
9170: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
9180: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
9190: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43  lumn;.        iC
91a0: 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d  ursor = pOrTerm-
91b0: 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  >leftCursor;.   
91c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
91d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
91e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
91f0: 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62  No candidate tab
9200: 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f  le+column was fo
9210: 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f  und.  This can o
9220: 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20  nly occur.      
9230: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f    ** on the seco
9240: 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  nd iteration */.
9250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9260: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
9270: 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f 49  assert( (chngToI
9280: 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29 3d  N&(chngToIN-1))=
9290: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
92a0: 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d  sert( chngToIN==
92b0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
92c0: 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  , iCursor) );.  
92d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92e0: 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
92f0: 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20  ase( j==1 );..  
9300: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66      /* We have f
9310: 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65  ound a candidate
9320: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
9330: 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  n.  Check to see
9340: 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   if that.      *
9350: 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  * table and colu
9360: 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  mn is common to 
9370: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
9380: 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20  e OR clause */. 
9390: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
93a0: 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  N = 1;.      for
93b0: 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43  (; i>=0 && okToC
93c0: 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f  hngToIN; i--, pO
93d0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
93e0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
93f0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
9400: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69  _EQ );.        i
9410: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
9420: 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20  Cursor!=iCursor 
9430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
9440: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
9450: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
9460: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9470: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
9480: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29  olumn!=iColumn )
9490: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f  {.          okTo
94a0: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
94b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
94c0: 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65         int affLe
94d0: 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20  ft, affRight;.  
94e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
94f0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
9500: 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75  e is also a colu
9510: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  mn, then the aff
9520: 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20  inities.        
9530: 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67    ** of both rig
9540: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
9550: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
9560: 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20  hat no type.    
9570: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73        ** convers
9580: 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
9590: 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  d on the right. 
95a0: 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a   (Ticket #2249).
95b0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
95c0: 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20         affRight 
95d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
95e0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
95f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9600: 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74           affLeft
9610: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9620: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
9630: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9640: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66           if( aff
9650: 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52  Right!=0 && affR
9660: 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b  ight!=affLeft ){
9670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54  .            okT
9680: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
9690: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54              pOrT
96b0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
96c0: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20  TERM_OR_OK;.    
96d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
96e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
96f0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
9700: 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54  point, okToChngT
9710: 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f  oIN is true if o
9720: 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61  riginal pTerm sa
9730: 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63  tisfies.    ** c
9740: 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20  ase 1.  In that 
9750: 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20  case, construct 
9760: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  a new virtual te
9770: 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20  rm that is .    
9780: 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74  ** pTerm convert
9790: 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ed into an IN op
97a0: 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20  erator..    **. 
97b0: 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32 31     ** EV: R-0021
97c0: 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a 20  1-15100.    */. 
97d0: 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54     if( okToChngT
97e0: 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70  oIN ){.      Exp
97f0: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
9800: 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65      /* A transie
9810: 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70  nt duplicate exp
9820: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
9830: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9840: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52   = 0;   /* The R
9850: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9860: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
9870: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20  xpr *pLeft = 0; 
9880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53        /* The LHS
9890: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
98a0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  tor */.      Exp
98b0: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
98c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
98d0: 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  ete IN operator 
98e0: 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  */..      for(i=
98f0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
9900: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
9910: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
9920: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
9930: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77   if( (pOrTerm->w
9940: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  tFlags & TERM_OR
9950: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
9960: 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
9970: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
9980: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
9990: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
99a0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
99b0: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b  rsor==iCursor );
99c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
99d0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
99e0: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
99f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  );.        pDup 
9a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9a10: 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  (db, pOrTerm->pE
9a20: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  xpr->pRight, 0);
9a30: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
9a40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9a50: 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72  Append(pWC->pPar
9a60: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
9a70: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
9a80: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
9a90: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
9aa0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ab0: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
9ac0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
9ad0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
9ae0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
9af0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9b00: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
9b10: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
9b20: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9b30: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
9b40: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
9b50: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
9b60: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
9b70: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
9b80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
9b90: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
9ba0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
9bb0: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
9bc0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
9bd0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
9be0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
9bf0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
9c00: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
9c10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9c20: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
9c30: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
9c40: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
9c50: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
9c60: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9c70: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
9c80: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
9c90: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
9ca0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9cb0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
9cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ce0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
9cf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9d00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
9d10: 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65 20  r = 0;  /* case 
9d20: 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20  1 trumps case 2 
9d30: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  */.    }.  }.}.#
9d40: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9d50: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
9d60: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
9d70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
9d80: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  /.../*.** The in
9d90: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
9da0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
9db0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
9dc0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
9dd0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
9de0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
9df0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
9e00: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
9e10: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
9e20: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
9e30: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
9e40: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
9e50: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
9e60: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
9e70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9e80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
9e90: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
9ea0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
9eb0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
9ec0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
9ed0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
9ee0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ef0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
9f00: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
9f10: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
9f20: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
9f30: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
9f40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
9f50: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
9f60: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
9f70: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
9f80: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
9f90: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
9fa0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
9fb0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
9fc0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
9fd0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
9fe0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
9ff0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
a000: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
a010: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
a020: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
a030: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
a040: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
a050: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
a060: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
a070: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
a080: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
a090: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
a0a0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
a0b0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
a0c0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
a0d0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
a0e0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
a0f0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
a100: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
a110: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
a120: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
a130: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
a140: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
a150: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
a160: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
a170: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
a180: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
a190: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
a1a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
a1b0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
a1c0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
a1d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a1e0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
a1f0: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
a200: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a210: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
a220: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  *pMaskSet;      
a230: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61      /* Set of ta
a240: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20  ble index masks 
a250: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
a260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a270: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
a280: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
a290: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d  alyzed */.  Bitm
a2a0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20  ask prereqLeft; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
a2d0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66   the pExpr->pLef
a2e0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  t */.  Bitmask p
a2f0: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20  rereqAll;       
a300: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a310: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70  quesites of pExp
a320: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65  r */.  Bitmask e
a330: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20  xtraRight = 0;  
a340: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
a350: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e   dependencies on
a360: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20   LEFT JOIN */.  
a370: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b  Expr *pStr1 = 0;
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
a3a0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
a3b0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
a3c0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a3d0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49      /* RHS of LI
a3e0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74  KE/GLOB ends wit
a3f0: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20  h wildcard */.  
a400: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20  int noCase = 0; 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69   /* LIKE/GLOB di
a430: 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65  stinguishes case
a440: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  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 2f 2a 20 54 6f 70 2d 6c 65         /* Top-le
a470: 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70  vel operator.  p
a480: 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61  Expr->op */.  Pa
a490: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
a4a0: 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
a4b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a4c0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
a4d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a4e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a4f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a500: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
a510: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a520: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
a530: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
a540: 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b  dxTerm];.  pMask
a550: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
a560: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
a570: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70  Term->pExpr;.  p
a580: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
a590: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a5a0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
a5b0: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
a5c0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a5d0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
a5e0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
a5f0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
a600: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a610: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
a620: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
a630: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a640: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
a650: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
a660: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
a670: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
a680: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a690: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a6a0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
a6b0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
a6c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
a6d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
a6e0: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
a6f0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
a700: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
a710: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
a720: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
a730: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a740: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
a750: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
a760: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
a770: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a780: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
a790: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a7a0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a7b0: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
a7c0: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
a7d0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
a7e0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
a7f0: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
a800: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
a810: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
a820: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
a830: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
a840: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
a870: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
a880: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
a890: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
a8a0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
a8b0: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
a8c0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
a8d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
a8e0: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
a8f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
a900: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
a910: 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e  (op) && (pTerm->
a920: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
a930: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a  ereqLeft)==0 ){.
a940: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
a950: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
a960: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
a970: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
a980: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
a990: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
a9a0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  {.      pTerm->l
a9b0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
a9c0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
a9d0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
a9e0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
a9f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65  olumn;.      pTe
aa00: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
aa10: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29  operatorMask(op)
aa20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aa30: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
aa40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
aa50: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
aa60: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
aa70: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
aa80: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
aa90: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
aaa0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
aab0: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
aac0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
aad0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
aae0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
aaf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ab00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ab10: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
ab20: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
ab30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
ab40: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
ab50: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
ab60: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
ab70: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
ab80: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
ab90: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
aba0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
abb0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
abc0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
abd0: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
abe0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
abf0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
ac00: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
ac10: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
ac20: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
ac30: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
ac40: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
ac50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac60: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
ac70: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
ac80: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
ac90: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
aca0: 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70  ute(pParse, pDup
acb0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  );.      pLeft =
acc0: 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20   pDup->pLeft;.  
acd0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
ace0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
acf0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
ad00: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
ad10: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
ad20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ad30: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
ad40: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
ad50: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
ad60: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
ad70: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
ad80: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
ad90: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
ada0: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
adb0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
adc0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
add0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
ade0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
adf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ae00: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
ae10: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
ae20: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
ae30: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
ae40: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
ae50: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
ae60: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
ae70: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
ae80: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
ae90: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
aea0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
aeb0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
aec0: 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  c.  **.  ** is c
aed0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20  onverted into:. 
aee0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61   **.  **      (a
aef0: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
af00: 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44  ) AND (a>=b) AND
af10: 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a   (a<=c).  **.  *
af20: 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65  * The two new te
af30: 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e  rms are added on
af40: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
af50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
af60: 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
af70: 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79  ew terms are "dy
af80: 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63  namic" and are c
af90: 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f  hildren of the o
afa0: 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a  riginal BETWEEN.
afb0: 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74    ** term.  That
afc0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
afd0: 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  he BETWEEN term 
afe0: 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68  is coded, the ch
aff0: 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20  ildren are.  ** 
b000: 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66  skipped.  Or, if
b010: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
b020: 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61  e satisfied by a
b030: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69  n index, the ori
b040: 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45  ginal.  ** BETWE
b050: 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70  EN term is skipp
b060: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
b070: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b080: 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43  K_BETWEEN && pWC
b090: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
b0a0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
b0b0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
b0c0: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
b0d0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
b0e0: 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b  t u8 ops[] = {TK
b0f0: 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20  _GE, TK_LE};.   
b100: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
b110: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b120: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32   pList->nExpr==2
b130: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
b140: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
b150: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
b160: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e  ;.      int idxN
b170: 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  ew;.      pNewEx
b180: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
b190: 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d  r(pParse, ops[i]
b1a0: 2c 20 0a 20 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: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b1d0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
b1e0: 20 30 29 2c 0a 20 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 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
b210: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
b220: 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a  .pExpr, 0), 0);.
b230: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
b240: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
b250: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
b260: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b270: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b280: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b290: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ew==0 );.      e
b2a0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
b2b0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
b2c0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
b2d0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b2e0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
b2f0: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
b300: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
b310: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b320: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
b330: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
b340: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
b350: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
b360: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b370: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
b380: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
b390: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b3a0: 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  Y).  /* Analyze 
b3b0: 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 63  a term that is c
b3c0: 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f  omposed of two o
b3d0: 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73 20  r more subterms 
b3e0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 2a  connected by.  *
b3f0: 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72  * an OR operator
b400: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
b410: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b420: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
b430: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
b440: 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  D );.    exprAna
b450: 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63 2c  lyzeOrTerm(pSrc,
b460: 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a   pWC, idxTerm);.
b470: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
b480: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
b490: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b4a0: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b4b0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
b4c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b4d0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
b4e0: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
b4f0: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
b500: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
b510: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
b520: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
b530: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c  r..  **.  ** A l
b540: 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74  ike pattern of t
b550: 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20  he form "x LIKE 
b560: 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e 67  'abc%'" is chang
b570: 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69  ed into constrai
b580: 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nts.  **.  **   
b590: 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20         x>='abc' 
b5a0: 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20  AND x<'abd' AND 
b5b0: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20  x LIKE 'abc%'.  
b5c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74  **.  ** The last
b5d0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
b5e0: 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20 69  e prefix "abc" i
b5f0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f  s incremented to
b600: 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74   form the.  ** t
b610: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
b620: 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f  tion "abd"..  */
b630: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d  .  if( pWC->op==
b640: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73  TK_AND .   && is
b650: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73  LikeOrGlob(pPars
b660: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31  e, pExpr, &pStr1
b670: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
b680: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20  noCase).  ){.   
b690: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20   Expr *pLeft;   
b6a0: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49      /* LHS of LI
b6b0: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  KE/GLOB operator
b6c0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53   */.    Expr *pS
b6d0: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f  tr2;       /* Co
b6e0: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48  py of pStr1 - RH
b6f0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b700: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b710: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a  xpr *pNewExpr1;.
b720: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b730: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
b740: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64  New1;.    int id
b750: 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c 53  xNew2;.    CollS
b760: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
b770: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
b780: 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20  nce to use */.. 
b790: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b7a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b7b0: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b7c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b7d0: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b7e0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b7f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b800: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b810: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b820: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b830: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b840: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b850: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b860: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b870: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b880: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b890: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b8a0: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b8b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b8c0: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b8d0: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b8e0: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b8f0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b900: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b910: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b920: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b930: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b940: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b950: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b960: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b970: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b980: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b990: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b9a0: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b9b0: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b9c0: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b9d0: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b9e0: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b9f0: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
ba00: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
ba10: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
ba20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
ba30: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
ba40: 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45  lete = 0;   /* E
ba50: 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30 37  V: R-64339-08207
ba60: 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63 20   */...        c 
ba70: 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  = sqlite3UpperTo
ba80: 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20  Lower[c];.      
ba90: 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20  }.      *pC = c 
baa0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  + 1;.    }.    p
bab0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
bac0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
bad0: 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61 73  LITE_UTF8, noCas
bae0: 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22  e ? "NOCASE" : "
baf0: 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20 20  BINARY",0);.    
bb00: 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69  pNewExpr1 = sqli
bb10: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
bb20: 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20 20   TK_GE, .       
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
bb40: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
bb50: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
bb60: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
bb70: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
bb80: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31 2c            pStr1,
bb90: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31   0);.    idxNew1
bba0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
bbb0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
bbc0: 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr1, TERM_VIRTUA
bbd0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
bbe0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
bbf0: 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20  dxNew1==0 );.   
bc00: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
bc10: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29  c, pWC, idxNew1)
bc20: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20  ;.    pNewExpr2 
bc30: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
bc40: 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20  Parse, TK_LT,.  
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
bc70: 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78 70  tColl(sqlite3Exp
bc80: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29  rDup(db,pLeft,0)
bc90: 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20  , pColl),.      
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bcb0: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
bcc0: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
bcd0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
bce0: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
bcf0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
bd00: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
bd10: 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29  se( idxNew2==0 )
bd20: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
bd30: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
bd40: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
bd50: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
bd60: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
bd70: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
bd80: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
bd90: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
bda0: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
bdb0: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
bdc0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
bdd0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
bde0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
bdf0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
be00: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
be10: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
be20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be30: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
be40: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
be50: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
be60: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
be70: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
be80: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
be90: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
bea0: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
beb0: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
bec0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
bed0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
bee0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
bef0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
bf00: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
bf10: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
bf20: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
bf30: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
bf40: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
bf50: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
bf60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
bf70: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
bf80: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
bf90: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
bfa0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
bfb0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
bfc0: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
bfd0: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
bfe0: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
bff0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
c000: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
c010: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
c020: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c030: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c040: 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20 3d      prereqExpr =
c050: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c060: 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74  pMaskSet, pRight
c070: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c  );.    prereqCol
c080: 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55  umn = exprTableU
c090: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
c0a0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28  Left);.    if( (
c0b0: 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72 65  prereqExpr & pre
c0c0: 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b  reqColumn)==0 ){
c0d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
c0e0: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  wExpr;.      pNe
c0f0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  wExpr = sqlite3P
c100: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
c110: 4d 41 54 43 48 2c 20 0a 20 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 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
c140: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
c150: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  ht, 0), 0);.    
c160: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c170: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c180: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
c190: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
c1a0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
c1b0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
c1c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  0 );.      pNewT
c1d0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c1e0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
c1f0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
c200: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
c210: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c220: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c230: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c240: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c250: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c260: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c270: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c280: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
c290: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c2a0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
c2b0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
c2c0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c2d0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
c2e0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
c2f0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
c300: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
c310: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
c320: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
c330: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
c340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c350: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c360: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
c370: 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
c380: 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
c390: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
c3a0: 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
c3b0: 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
c3c0: 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
c3d0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
c3e0: 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
c3f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c400: 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
c410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
c420: 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66  n TRUE if any of
c430: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
c440: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69   in pList->a[iFi
c450: 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a  rst...] contain.
c460: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
c470: 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65  o any table othe
c480: 72 20 74 68 61 6e 20 74 68 65 20 69 42 61 73 65  r than the iBase
c490: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
c4a0: 63 20 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73  c int references
c4b0: 4f 74 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45  OtherTables(.  E
c4c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
c4e0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ch expressions i
c4f0: 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20  n ths list */.  
c500: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
c510: 61 73 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70  askSet,   /* Map
c520: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  ping from tables
c530: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
c540: 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
c550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
c560: 20 73 65 61 72 63 68 69 6e 67 20 77 69 74 68 20   searching with 
c570: 74 68 65 20 69 46 69 72 73 74 2d 74 68 20 65 78  the iFirst-th ex
c580: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
c590: 74 20 69 42 61 73 65 20 20 20 20 20 20 20 20 20  t iBase         
c5a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
c5b0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
c5c0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
c5d0: 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77  .  Bitmask allow
c5e0: 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  ed = ~getMask(pM
c5f0: 61 73 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a  askSet, iBase);.
c600: 20 20 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c    while( iFirst<
c610: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
c620: 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61 62      if( (exprTab
c630: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c640: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  , pList->a[iFirs
c650: 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f  t++].pExpr)&allo
c660: 77 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  wed)!=0 ){.     
c670: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c680: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c690: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
c6a0: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
c6b0: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
c6c0: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
c6d0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
c6e0: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
c6f0: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
c700: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
c710: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
c720: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
c730: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
c740: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
c750: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
c760: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
c770: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
c780: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
c790: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
c7a0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
c7b0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
c7c0: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
c7d0: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
c7e0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
c7f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
c800: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
c810: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
c820: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
c830: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c840: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
c850: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
c860: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
c870: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
c880: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
c890: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
c8a0: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
c8b0: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
c8c0: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
c8d0: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
c8e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
c8f0: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
c900: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
c910: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
c920: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
c930: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
c940: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
c950: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
c960: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
c970: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
c980: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
c990: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
c9a0: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
c9b0: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
c9c0: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
c9d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c9e0: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
c9f0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
ca00: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
ca10: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
ca20: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
ca30: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
ca40: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
ca50: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ca60: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ca70: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
ca80: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
ca90: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
caa0: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
cab0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
cac0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
cad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cae0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
caf0: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
cb00: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
cb10: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
cb20: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
cb30: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
cb40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
cb50: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
cb60: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
cb70: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
cb80: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
cb90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
cba0: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
cbb0: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
cbc0: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cbe0: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
cbf0: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
cc00: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cc30: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ters */.  int so
cc40: 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20  rtOrder = 0;    
cc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52            /* XOR
cc60: 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f 52   of index and OR
cc70: 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72 65  DER BY sort dire
cc80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
cc90: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
cca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ccb0: 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
ccc0: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75   terms */.  stru
ccd0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
cce0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41   *pTerm;    /* A
ccf0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
cd00: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
cd10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cd20: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
cd30: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
cd40: 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20  =0 );.  nTerm = 
cd50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
cd60: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d  .  assert( nTerm
cd70: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75  >0 );..  /* Argu
cd80: 6d 65 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65  ment pIdx must e
cd90: 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61  ither point to a
cda0: 20 27 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e   'real' named in
cdb0: 64 65 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a  dex structure, .
cdc0: 20 20 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78    ** or an index
cdd0: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
cde0: 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63  ated on the stac
cdf0: 6b 20 62 79 20 62 65 73 74 42 74 72 65 65 49 6e  k by bestBtreeIn
ce00: 64 65 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  dex() to.  ** re
ce10: 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69  present the rowi
ce20: 64 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  d index that is 
ce30: 70 61 72 74 20 6f 66 20 65 76 65 72 79 20 74 61  part of every ta
ce40: 62 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ble.  */.  asser
ce50: 74 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c  t( pIdx->zName |
ce60: 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  | (pIdx->nColumn
ce70: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43  ==1 && pIdx->aiC
ce80: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b  olumn[0]==-1) );
ce90: 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72  ..  /* Match ter
cea0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
ceb0: 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73  BY clause agains
cec0: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  t columns of.  *
ced0: 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  * the index..  *
cee0: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
cef0: 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70 49   indices have pI
cf00: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75  dx->nColumn regu
cf10: 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73  lar columns plus
cf20: 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69  .  ** one additi
cf30: 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  onal column cont
cf40: 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  aining the rowid
cf50: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c  .  The rowid col
cf60: 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  umn.  ** of the 
cf70: 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c  index is also al
cf80: 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61  lowed to match a
cf90: 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52  gainst the ORDER
cfa0: 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e   BY.  ** clause.
cfb0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
cfc0: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
cfd0: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
cfe0: 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i<=pIdx->nColum
cff0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  n; i++){.    Exp
d000: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
d010: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d020: 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  n of the ORDER B
d030: 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43  Y pTerm */.    C
d040: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
d050: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
d060: 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70  ng sequence of p
d070: 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Expr */.    int 
d080: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f  termSortOrder; /
d090: 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  * Sort order for
d0a0: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
d0b0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
d0c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
d0d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
d0e0: 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f  ndex.  -1 for ro
d0f0: 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  wid */.    int i
d100: 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a  SortOrder;    /*
d110: 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66   1 for DESC, 0 f
d120: 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d  or ASC on the i-
d130: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d140: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d150: 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20  *zColl; /* Name 
d160: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  of the collating
d170: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d   sequence for i-
d180: 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f  th index term */
d190: 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 54  ..    pExpr = pT
d1a0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
d1b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
d1c0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
d1d0: 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20  r->iTable!=base 
d1e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20  ){.      /* Can 
d1f0: 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  not use an index
d200: 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e   sort on anythin
d210: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  g that is not a 
d220: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20  column in the.  
d230: 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74      ** left-most
d240: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52   table of the FR
d250: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
d260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d270: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d280: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d290: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
d2a0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
d2b0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64  .      pColl = d
d2c0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
d2d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
d2e0: 2d 3e 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64  ->zName && i<pId
d2f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
d300: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
d310: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d320: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75  .      if( iColu
d330: 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65  mn==pIdx->pTable
d340: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
d350: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
d360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d370: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
d380: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
d390: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
d3a0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
d3b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3c0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
d3d0: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
d3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  = 0;.      zColl
d3f0: 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
d400: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
d410: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
d420: 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65  Column || sqlite
d430: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
d440: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
d450: 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a  .      /* Term j
d460: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d470: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
d480: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20   match column i 
d490: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
d4a0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43        if( i<nEqC
d4b0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ol ){.        /*
d4c0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
d4d0: 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73  umn that is cons
d4e0: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61  trained by == fa
d4f0: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a  ils to match an.
d500: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
d510: 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69   BY term, that i
d520: 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f  s OK.  Just igno
d530: 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f  re that column o
d540: 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  f the index.    
d550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
d560: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
d570: 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78  else if( i==pIdx
d580: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
d590: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f       /* Index co
d5a0: 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f  lumn i is the ro
d5b0: 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  wid.  All other 
d5c0: 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a  terms match. */.
d5d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d5e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d5f0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
d600: 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20  ex column fails 
d610: 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20  to match and is 
d620: 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  not constrained 
d630: 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a  by ==.        **
d640: 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
d650: 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74  cannot satisfy t
d660: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73  he ORDER BY cons
d670: 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20  traint..        
d680: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
d690: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
d6a0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
d6b0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  Idx->aSortOrder!
d6c0: 3d 30 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d  =0 || iColumn==-
d6d0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
d6e0: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
d6f0: 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73  r==0 || pTerm->s
d700: 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20  ortOrder==1 );. 
d710: 20 20 20 61 73 73 65 72 74 28 20 69 53 6f 72 74     assert( iSort
d720: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72  Order==0 || iSor
d730: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
d740: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d   termSortOrder =
d750: 20 69 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54   iSortOrder ^ pT
d760: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
d770: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
d780: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65   ){.      if( te
d790: 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72  rmSortOrder!=sor
d7a0: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
d7b0: 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e    /* Indices can
d7c0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
d7d0: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
d7e0: 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  rms past the.   
d7f0: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
d800: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
d810: 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43   all either DESC
d820: 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20   or ASC. */.    
d830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d840: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d850: 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
d860: 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
d870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
d880: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
d890: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
d8a0: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
d8b0: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
d8c0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c  By, pMaskSet, j,
d8d0: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20   base) ){.      
d8e0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 65  /* If the indexe
d8f0: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  d column is the 
d900: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20  primary key and 
d910: 65 76 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68  everything match
d920: 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66  es.      ** so f
d930: 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  ar and none of t
d940: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
d950: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 72  s to the right r
d960: 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20  eference other. 
d970: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69       ** tables i
d980: 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e  n the join, then
d990: 20 77 65 20 61 72 65 20 61 73 73 75 72 65 64 20   we are assured 
d9a0: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 63  that the index c
d9b0: 61 6e 20 62 65 20 75 73 65 64 20 0a 20 20 20 20  an be used .    
d9c0: 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63    ** to sort bec
d9d0: 61 75 73 65 20 74 68 65 20 70 72 69 6d 61 72 79  ause the primary
d9e0: 20 6b 65 79 20 69 73 20 75 6e 69 71 75 65 20 61   key is unique a
d9f0: 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68  nd so none of th
da00: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
da10: 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61   columns will ma
da20: 6b 65 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63  ke any differenc
da30: 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
da40: 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   j = nTerm;.    
da50: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20  }.  }..  *pbRev 
da60: 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a  = sortOrder!=0;.
da70: 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29    if( j>=nTerm )
da80: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
da90: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
daa0: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f  BY clause are co
dab0: 76 65 72 65 64 20 62 79 20 74 68 69 73 20 69 6e  vered by this in
dac0: 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68  dex so.    ** th
dad0: 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  is index can be 
dae0: 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
daf0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
db00: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  1;.  }.  if( pId
db10: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
db20: 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e  one && i==pIdx->
db30: 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26  nColumn.      &&
db40: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
db50: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
db60: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
db70: 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ase) ){.    /* A
db80: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73  ll terms of this
db90: 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d   index match som
dba0: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
dbb0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
dbc0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69      ** and the i
dbd0: 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61  ndex is UNIQUE a
dbe0: 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74  nd no terms on t
dbf0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f  he tail of the O
dc00: 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
dc10: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20  lause reference 
dc20: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
dc30: 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73  a join.  If this
dc40: 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65   is all true the
dc50: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64  n.    ** the ord
dc60: 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20  er by clause is 
dc70: 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a  superfluous. */.
dc80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
dc90: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
dca0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
dcb0: 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20   crude estimate 
dcc0: 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d  of the logarithm
dcd0: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61   of the input va
dce0: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  lue..** The resu
dcf0: 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  lts need not be 
dd00: 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20  exact.  This is 
dd10: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73  only used for es
dd20: 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  timating.** the 
dd30: 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65  total cost of pe
dd40: 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69  rforming operati
dd50: 6f 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29  ons with O(logN)
dd60: 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20   or O(NlogN).** 
dd70: 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63  complexity.  Bec
dd80: 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61  ause N is just a
dd90: 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f   guess, it is no
dda0: 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69   great tragedy i
ddb0: 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c  f.** logN is a l
ddc0: 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74  ittle off..*/.st
ddd0: 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c  atic double estL
dde0: 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20  og(double N){.  
ddf0: 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b  double logN = 1;
de00: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
de10: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29  ;.  while( N>x )
de20: 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b  {.    logN += 1;
de30: 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20  .    x *= 10;.  
de40: 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b  }.  return logN;
de50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
de60: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
de70: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
de80: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
de90: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
dea0: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
deb0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
dec0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
ded0: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
dee0: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
def0: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
df00: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
df10: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
df20: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
df30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
df40: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
df50: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
df60: 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
df70: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
df80: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
df90: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
dfa0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
dfb0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
dfc0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
dfd0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
dfe0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
dff0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e000: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
e010: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
e020: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
e030: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
e040: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
e050: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
e060: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
e070: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e080: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
e090: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e0a0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
e0b0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e0c0: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
e0d0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
e0e0: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
e0f0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e100: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
e110: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
e120: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
e130: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
e140: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
e150: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
e160: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
e170: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
e180: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
e190: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
e1a0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
e1b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
e1c0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
e1d0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
e1e0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
e1f0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
e200: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e210: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
e220: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
e230: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
e240: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e250: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
e260: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
e270: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e280: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
e290: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e2a0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
e2b0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
e2c0: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
e2d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e2e0: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
e2f0: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
e300: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e310: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
e320: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
e330: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
e340: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e350: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
e360: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
e370: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d  stimatedCost);.}
e380: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
e390: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
e3a0: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
e3b0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
e3c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52  #endif../* .** R
e3d0: 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
e3e0: 62 65 73 74 49 6e 64 65 78 28 29 20 69 73 20 63  bestIndex() is c
e3f0: 61 6c 6c 65 64 20 62 79 20 62 65 73 74 4f 72 43  alled by bestOrC
e400: 6c 61 75 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f  lauseIndex() .*/
e410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
e420: 74 49 6e 64 65 78 28 0a 20 20 20 20 50 61 72 73  tIndex(.    Pars
e430: 65 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  e*, WhereClause*
e440: 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
e450: 5f 69 74 65 6d 2a 2c 20 42 69 74 6d 61 73 6b 2c  _item*, Bitmask,
e460: 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68 65 72   ExprList*, Wher
e470: 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  eCost*);../*.** 
e480: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
e490: 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e  empts to find an
e4a0: 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65   scanning strate
e4b0: 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  gy that can be u
e4c0: 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d  sed .** to optim
e4d0: 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72  ize an 'OR' expr
e4e0: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
e4f0: 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20 63  art of a WHERE c
e500: 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  lause. .**.** Th
e510: 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
e520: 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61  ed with FROM cla
e530: 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61  use term pSrc ma
e540: 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a  y be either a.**
e550: 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20   regular B-Tree 
e560: 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75  table or a virtu
e570: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
e580: 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43  tic void bestOrC
e590: 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20 50 61  lauseIndex(.  Pa
e5a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e5c0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
e5d0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
e5e0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
e5f0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
e600: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
e610: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
e620: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
e630: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
e640: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
e650: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
e660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
e670: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
e680: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
e690: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
e6a0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
e6b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
e6c0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
e6d0: 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
e6e0: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
e6f0: 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
e700: 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66  y plan */.){.#if
e710: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e720: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
e730: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75  .  const int iCu
e740: 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
e750: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
e760: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
e770: 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a  to be accessed *
e780: 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73  /.  const Bitmas
e790: 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d  k maskSrc = getM
e7a0: 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65  ask(pWC->pMaskSe
e7b0: 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69  t, iCur);  /* Bi
e7c0: 74 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a  tmask for pSrc *
e7d0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20  /.  WhereTerm * 
e7e0: 63 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26  const pWCEnd = &
e7f0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
e800: 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  m];        /* En
e810: 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f  d of pWC->a[] */
e820: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
e830: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
e840: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
e850: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
e860: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  RE clause */..  
e870: 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75 73 65 20  /* No OR-clause 
e880: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c  optimization all
e890: 6f 77 65 64 20 69 66 20 74 68 65 20 4e 4f 54 20  owed if the NOT 
e8a0: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 69  INDEXED clause i
e8b0: 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20  s used */.  if( 
e8c0: 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
e8d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
e8e0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
e8f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
e900: 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73  e terms for a us
e910: 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e  able WO_OR term.
e920: 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   */.  for(pTerm=
e930: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
e940: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
e950: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
e960: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20  Operator==WO_OR 
e970: 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d  .     && ((pTerm
e980: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d  ->prereqAll & ~m
e990: 61 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61  askSrc) & notRea
e9a0: 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  dy)==0.     && (
e9b0: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
e9c0: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61  ->indexable & ma
e9d0: 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29  skSrc)!=0 .    )
e9e0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61  {.      WhereCla
e9f0: 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57  use * const pOrW
ea00: 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f  C = &pTerm->u.pO
ea10: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  rInfo->wc;.     
ea20: 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e   WhereTerm * con
ea30: 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70  st pOrWCEnd = &p
ea40: 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e  OrWC->a[pOrWC->n
ea50: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65  Term];.      Whe
ea60: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
ea70: 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
ea80: 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   = WHERE_MULTI_O
ea90: 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  R;.      double 
eaa0: 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  rTotal = 0;.    
eab0: 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20    double nRow = 
eac0: 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  0;.      Bitmask
ead0: 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20   used = 0;..    
eae0: 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
eaf0: 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
eb00: 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
eb10: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68  m++){.        Wh
eb20: 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73  ereCost sTermCos
eb30: 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  t;.        WHERE
eb40: 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74  TRACE(("... Mult
eb50: 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69  i-index OR testi
eb60: 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f  ng for term %d o
eb70: 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20  f %d....\n", .  
eb80: 20 20 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d          (pOrTerm
eb90: 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70   - pOrWC->a), (p
eba0: 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20  Term - pWC->a). 
ebb0: 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20         ));.     
ebc0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
ebd0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e  eOperator==WO_AN
ebe0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  D ){.          W
ebf0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
ec00: 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
ec10: 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
ec20: 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e 64           bestInd
ec30: 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57  ex(pParse, pAndW
ec40: 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
ec50: 79 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74  y, 0, &sTermCost
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ec70: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
ec80: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
ec90: 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
eca0: 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a  eClause tempWC;.
ecb0: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
ecc0: 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  .pParse = pWC->p
ecd0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
ece0: 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74   tempWC.pMaskSet
ecf0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
ed00: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
ed10: 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  WC.op = TK_AND;.
ed20: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
ed30: 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
ed40: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e          tempWC.n
ed50: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
ed60: 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50      bestIndex(pP
ed70: 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70  arse, &tempWC, p
ed80: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30  Src, notReady, 0
ed90: 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
eda0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
edb0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
edc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
edd0: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54      rTotal += sT
ede0: 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20  ermCost.rCost;. 
edf0: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73         nRow += s
ee00: 54 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20  TermCost.nRow;. 
ee10: 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 73         used |= s
ee20: 54 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20  TermCost.used;. 
ee30: 20 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61         if( rTota
ee40: 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  l>=pCost->rCost 
ee50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
ee60: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
ee70: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
ee80: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
ee90: 61 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73  ase the scan cos
eea0: 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20  t to account .  
eeb0: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
eec0: 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e  ost of the sort.
eed0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
eee0: 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20  rderBy!=0 ){.   
eef0: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
ef00: 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
ef10: 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20  creases OR cost 
ef20: 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  %.9g to %.9g\n",
ef30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef40: 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f       rTotal, rTo
ef50: 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28  tal+nRow*estLog(
ef60: 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20 20  nRow)));.       
ef70: 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a   rTotal += nRow*
ef80: 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
ef90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
efa0: 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  If the cost of s
efb0: 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68  canning using th
efc0: 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f  is OR term for o
efd0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20  ptimization is. 
efe0: 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
eff0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  n the current co
f000: 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f  st stored in pCo
f010: 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20  st, replace the 
f020: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a  contents.      *
f030: 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20  * of pCost. */. 
f040: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
f050: 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65  ("... multi-inde
f060: 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e  x OR cost=%.9g n
f070: 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f  row=%.9g\n", rTo
f080: 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20  tal, nRow));.   
f090: 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 43     if( rTotal<pC
f0a0: 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
f0b0: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
f0c0: 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20  st = rTotal;.   
f0d0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77       pCost->nRow
f0e0: 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20   = nRow;.       
f0f0: 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75   pCost->used = u
f100: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  sed;.        pCo
f110: 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
f120: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   = flags;.      
f130: 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
f140: 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20  pTerm = pTerm;. 
f150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f160: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f170: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
f180: 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66  ZATION */.}..#if
f190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1a0: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
f1b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f1c0: 55 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20  UE if the WHERE 
f1d0: 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72  clause term pTer
f1e0: 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77  m is of a form w
f1f0: 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64  here it.** could
f200: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
f210: 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73   index to access
f220: 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20   pSrc, assuming 
f230: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  an appropriate.*
f240: 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e  * index existed.
f250: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
f260: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
f270: 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  (.  WhereTerm *p
f280: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
f290: 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
f2a0: 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b  se term to check
f2b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
f2c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
f2d0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65       /* Table we
f2e0: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61   are trying to a
f2f0: 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61  ccess */.  Bitma
f300: 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
f310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
f320: 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  les in outer loo
f330: 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ps of the join *
f340: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  /.){.  char aff;
f350: 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65  .  if( pTerm->le
f360: 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e  ftCursor!=pSrc->
f370: 69 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  iCursor ) return
f380: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
f390: 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45  >eOperator!=WO_E
f3a0: 51 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  Q ) return 0;.  
f3b0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
f3c0: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
f3d0: 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
f3e0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
f3f0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
f400: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
f410: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
f420: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
f430: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
f440: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
f450: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
f460: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   1;.}.#endif..#i
f470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f480: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
f490: 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  X./*.** If the q
f4a0: 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53  uery plan for pS
f4b0: 72 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  rc specified in 
f4c0: 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20  pCost is a full 
f4d0: 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e  table scan.** an
f4e0: 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c  d indexing is al
f4f0: 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69  lows (if there i
f500: 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44  s no NOT INDEXED
f510: 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a   clause) and it.
f520: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ** possible to c
f530: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73  onstruct a trans
f540: 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20  ient index that 
f550: 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65  would perform be
f560: 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66  tter.** than a f
f570: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65  ull table scan e
f580: 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73  ven when the cos
f590: 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e  t of constructin
f5a0: 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69  g the index.** i
f5b0: 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  s taken into acc
f5c0: 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72  ount, then alter
f5d0: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
f5e0: 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72  to use the.** tr
f5f0: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a  ansient index..*
f600: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
f610: 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  stAutomaticIndex
f620: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f630: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f640: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
f650: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f660: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
f670: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
f680: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
f690: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f6a0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
f6b0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
f6c0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
f6d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
f6e0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
f6f0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
f700: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
f710: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57  available */.  W
f720: 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
f730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
f740: 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
f750: 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75  plan */.){.  dou
f760: 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20  ble nTableRow;  
f770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
f780: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
f790: 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  ble */.  double 
f7a0: 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20  logN;           
f7b0: 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62       /* log(nTab
f7c0: 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62  leRow) */.  doub
f7d0: 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20  le costTempIdx; 
f7e0: 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71          /* per-q
f7f0: 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65  uery cost of the
f800: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
f810: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
f820: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
f830: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
f840: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
f850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
f860: 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
f870: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
f880: 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
f890: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f8b0: 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62  able tht might b
f8c0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  e indexed */..  
f8d0: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
f8e0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
f8f0: 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b  AutoIndex)==0 ){
f900: 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  .    /* Automati
f910: 63 20 69 6e 64 69 63 65 73 20 61 72 65 20 64 69  c indices are di
f920: 73 61 62 6c 65 64 20 61 74 20 72 75 6e 2d 74 69  sabled at run-ti
f930: 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  me */.    return
f940: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f  ;.  }.  if( (pCo
f950: 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
f960: 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
f970: 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a 20 20 20  LSCAN)!=0 ){.   
f980: 20 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20 68   /* We already h
f990: 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66  ave some kind of
f9a0: 20 69 6e 64 65 78 20 69 6e 20 75 73 65 20 66 6f   index in use fo
f9b0: 72 20 74 68 69 73 20 71 75 65 72 79 2e 20 2a 2f  r this query. */
f9c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f9d0: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
f9e0: 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 2f  Indexed ){.    /
f9f0: 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44 45 58 45  * The NOT INDEXE
fa00: 44 20 63 6c 61 75 73 65 20 61 70 70 65 61 72 73  D clause appears
fa10: 20 69 6e 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a   in the SQL. */.
fa20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fa30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
fa40: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3e 3d  e->nQueryLoop >=
fa50: 20 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a 20 20   (double)1 );.  
fa60: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
fa70: 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52 6f 77  Tab;.  nTableRow
fa80: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
fa90: 78 20 3f 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x ? pTable->pInd
faa0: 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  ex->aiRowEst[0] 
fab0: 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 6c 6f 67  : 1000000;.  log
fac0: 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c  N = estLog(nTabl
fad0: 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d  eRow);.  costTem
fae0: 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e  pIdx = 2*logN*(n
faf0: 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d  TableRow/pParse-
fb00: 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29  >nQueryLoop + 1)
fb10: 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70  ;.  if( costTemp
fb20: 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  Idx>=pCost->rCos
fb30: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
fb40: 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67  cost of creating
fb50: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
fb60: 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72  able would be gr
fb70: 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  eater than.    *
fb80: 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c  * doing the full
fb90: 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
fba0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
fbb0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
fbc0: 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d  any equality com
fbd0: 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a  parison term */.
fbe0: 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
fbf0: 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
fc00: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
fc10: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
fc20: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
fc30: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
fc40: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
fc50: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
fc60: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
fc70: 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65  (("auto-index re
fc80: 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20  duces cost from 
fc90: 25 2e 32 66 20 74 6f 20 25 2e 32 66 5c 6e 22 2c  %.2f to %.2f\n",
fca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fcb0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
fcc0: 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29  t, costTempIdx))
fcd0: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  ;.      pCost->r
fce0: 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49  Cost = costTempI
fcf0: 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  dx;.      pCost-
fd00: 3e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31  >nRow = logN + 1
fd10: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
fd20: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
fd30: 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
fd40: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
fd50: 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
fd60: 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
fd70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
fd80: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
fd90: 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
fda0: 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29 20 20 2f  ex(A,B,C,D,E)  /
fdb0: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
fdc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fdd0: 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
fde0: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
fdf0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
fe00: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
fe10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
fe20: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
fe30: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
fe40: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
fe50: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
fe60: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
fe70: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
fe80: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
fe90: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
fea0: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
feb0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
fec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fed0: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
fee0: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
fef0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
ff00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ff10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ff20: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
ff30: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
ff40: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
ff50: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
ff60: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
ff70: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
ff80: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
ff90: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
ffa0: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
ffb0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
ffc0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
ffd0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
ffe0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
fff0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10000 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
10010 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
10020 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
10030 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t nColumn;      
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10050 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10060 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
10070 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
10080 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
10090 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
100a0 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
100b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
100c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
100d0 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
100e0 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
100f0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  ] */.  int nByte
10100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10110 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65     /* Byte of me
10120 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20  mory needed for 
10130 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
10140 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
10150 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
10160 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74  describing the t
10170 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
10180 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
101b0 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
101c0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
101d0 74 20 72 65 67 49 73 49 6e 69 74 3b 20 20 20 20  t regIsInit;    
101e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
101f0 69 73 74 65 72 20 73 65 74 20 62 79 20 69 6e 69  ister set by ini
10200 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
10210 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20   int addrInit;  
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10230 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
10240 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79  nitialization by
10250 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54  pass jump */.  T
10260 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
10270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10280 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
10290 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e  dexed */.  KeyIn
102a0 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20  fo *pKeyinfo;   
102b0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e         /* Key in
102c0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
102d0 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20  e index */   .  
102e0 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
102f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10300 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
10310 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
10320 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
10330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10340 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
10350 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
10360 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
10390 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
103c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
103d0 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
103e0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
103f0 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
10400 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
10410 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
10420 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
10430 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
10440 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
10450 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
10460 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
10470 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
10480 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
10490 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
104a0 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
104b0 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
104c0 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
104d0 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47  lumns */..  /* G
104e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
104f0 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
10500 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
10510 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
10520 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
10530 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
10540 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
10550 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
10560 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
10570 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
10580 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
10590 72 65 67 49 73 49 6e 69 74 20 3d 20 2b 2b 70 50  regIsInit = ++pP
105a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61 64  arse->nMem;.  ad
105b0 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
105c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
105d0 5f 49 66 2c 20 72 65 67 49 73 49 6e 69 74 29 3b  _If, regIsInit);
105e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
105f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10600 65 72 2c 20 31 2c 20 72 65 67 49 73 49 6e 69 74  er, 1, regIsInit
10610 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
10620 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
10630 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
10640 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
10650 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
10660 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
10670 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
10680 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
10690 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
106a0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
106b0 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
106c0 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
106d0 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
106e0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
106f0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
10700 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
10710 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
10720 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
10730 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
10740 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
10750 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
10760 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
10770 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
10780 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
10790 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
107a0 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
107b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
107c0 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
107d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
107e0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
107f0 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
10800 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
10810 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b         nColumn++
10820 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
10830 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
10840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10850 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
10860 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  0 );.  pLevel->p
10870 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d  lan.nEq = nColum
10880 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  n;..  /* Count t
10890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
108a0 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
108b0 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
108c0 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
108d0 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
108e0 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
108f0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
10900 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
10910 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
10920 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
10930 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
10940 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
10950 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
10960 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
10970 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
10980 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
10990 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
109a0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
109b0 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
109c0 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
109d0 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
109e0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
109f0 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
10a00 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
10a10 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
10a20 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
10a30 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
10a40 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
10a50 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
10a60 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
10a70 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   | (((Bitmask)1)
10a80 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d  <<(BMS-1)));.  m
10a90 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c  xBitCol = (pTabl
10aa0 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31  e->nCol >= BMS-1
10ab0 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62  ) ? BMS-1 : pTab
10ac0 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74  le->nCol;.  test
10ad0 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
10ae0 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
10af0 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
10b00 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
10b10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
10b20 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
10b30 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
10b40 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
10b50 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a  i) ) nColumn++;.
10b60 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
10b70 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
10b80 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
10b90 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  ) ){.    nColumn
10ba0 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
10bb0 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
10bc0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77    pLevel->plan.w
10bd0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
10be0 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
10bf0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f 5f  E_IDX_ONLY | WO_
10c00 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  EQ;..  /* Constr
10c10 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
10c20 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
10c30 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
10c40 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
10c50 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20  Index);.  nByte 
10c60 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
10c70 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49  f(int);     /* I
10c80 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f  ndex.aiColumn */
10c90 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
10ca0 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  umn*sizeof(char*
10cb0 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a  );   /* Index.az
10cc0 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20  Coll */.  nByte 
10cd0 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  += nColumn;     
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10cf0 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
10d00 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
10d10 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10d20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
10d30 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  e);.  if( pIdx==
10d40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c  0 ) return;.  pL
10d50 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
10d60 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
10d70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
10d80 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70  **)&pIdx[1];.  p
10d90 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
10da0 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43  (int*)&pIdx->azC
10db0 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  oll[nColumn];.  
10dc0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
10dd0 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61   = (u8*)&pIdx->a
10de0 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d  iColumn[nColumn]
10df0 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
10e00 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
10e10 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
10e20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64  = nColumn;.  pId
10e30 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
10e40 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
10e50 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
10e60 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
10e70 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
10e80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
10e90 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
10ea0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
10eb0 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
10ec0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
10ed0 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10ee0 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
10ef0 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
10f00 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29  S ? ((Bitmask)1)
10f10 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69  <<(BMS-1) : ((Bi
10f20 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a  tmask)1)<<iCol;.
10f30 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
10f40 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
10f50 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
10f60 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
10f70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
10f80 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
10f90 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
10fa0 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
10fb0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
10fc0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
10fd0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
10fe0 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
10ff0 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
11000 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
11010 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
11020 5d 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ] = pColl->zName
11030 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
11040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11050 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29  .  assert( (u32)
11060 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  n==pLevel->plan.
11070 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
11080 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
11090 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
110a0 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
110b0 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
110c0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
110d0 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
110e0 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
110f0 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
11100 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
11110 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20  )1)<<i) ){.     
11120 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
11130 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
11140 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
11150 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
11160 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
11170 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
11180 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29  ed & (((Bitmask)
11190 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
111a0 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
111b0 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
111c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
111d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
111e0 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
111f0 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
11200 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
11210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11220 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( n==nColumn 
11230 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
11240 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
11250 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66  dex */.  pKeyinf
11260 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
11270 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
11280 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28  pIdx);.  assert(
11290 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
112a0 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=0 );.  sqlite3
112b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
112c0 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20  _OpenAutoindex, 
112d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
112e0 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20   nColumn+1, 0,. 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e     (char*)pKeyin
11310 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
11320 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43  ANDOFF);.  VdbeC
11330 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
11340 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
11350 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
11360 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
11370 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
11380 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  t */.  addrTop =
11390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113a0 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
113b0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
113c0 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
113d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
113e0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
113f0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
11400 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
11410 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
11420 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
11430 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
11450 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
11460 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
11470 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
11480 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
11490 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
114a0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ULT);.  sqlite3V
114b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
114c0 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  Next, pLevel->iT
114d0 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31  abCur, addrTop+1
114e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
114f0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
11500 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
11510 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69  TOINDEX);.  sqli
11520 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11530 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
11540 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
11550 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
11560 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a  Record);.  .  /*
11570 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20   Jump here when 
11580 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
11590 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
115a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
115b0 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74  Here(v, addrInit
115c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
115d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
115e0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23  ATIC_INDEX */..#
115f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11600 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11610 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
11620 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73  nd populate an s
11630 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
11640 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20  o structure. It 
11650 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
11660 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11670 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
11680 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68  ually release th
11690 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62  e structure.** b
116a0 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f  y passing the po
116b0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
116c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
116d0 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
116e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  )..*/.static sql
116f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11700 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e  *allocateIndexIn
11710 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  fo(.  Parse *pPa
11720 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61  rse, .  WhereCla
11730 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75  use *pWC,.  stru
11740 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
11750 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73  *pSrc,.  ExprLis
11760 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20  t *pOrderBy.){. 
11770 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
11780 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74   nTerm;.  struct
11790 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
117a0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
117b0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
117c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
117d0 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
117e0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
117f0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
11800 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
11810 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
11820 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72  pTerm;.  int nOr
11830 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33  derBy;.  sqlite3
11840 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
11850 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54  xInfo;..  WHERET
11860 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69  RACE(("Recomputi
11870 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f  ng index info fo
11880 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63  r %s...\n", pSrc
11890 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
118a0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
118b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
118c0 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
118d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
118e0 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
118f0 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
11900 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
11910 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
11920 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
11930 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
11940 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
11950 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
11960 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
11970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
11980 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
11990 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
119a0 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
119b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
119c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
119d0 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
119e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
119f0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
11a00 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
11a10 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
11a20 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
11a30 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
11a40 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
11a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
11a60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
11a70 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
11a80 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
11a90 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
11aa0 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
11ab0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
11ac0 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
11ad0 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
11ae0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11af0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
11b00 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
11b10 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
11b20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11b30 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
11b40 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
11b50 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
11b60 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
11b70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  r;.      if( pEx
11b80 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
11b90 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
11ba0 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  le!=pSrc->iCurso
11bb0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
11bc0 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64  .    if( i==pOrd
11bd0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
11be0 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
11bf0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
11c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11c10 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
11c20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11c30 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a   structure.  */.
11c40 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c    pIdxInfo = sql
11c50 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11c60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
11c70 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20  eof(*pIdxInfo). 
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c90 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a            + (siz
11ca0 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b  eof(*pIdxCons) +
11cb0 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29   sizeof(*pUsage)
11cc0 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  )*nTerm.        
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
11cf0 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
11d00 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78  By );.  if( pIdx
11d10 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Info==0 ){.    s
11d20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11d30 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
11d40 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20  emory");.    /* 
11d50 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73  (double)0 In cas
11d60 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
11d70 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
11d80 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  .. */.    return
11d90 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   0;.  }..  /* In
11da0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
11db0 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
11dc0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11dd0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
11de0 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65  ns.  ** many fie
11df0 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65 63  lds that are dec
11e00 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f  lared "const" to
11e10 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e   prevent xBestIn
11e20 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68  dex from.  ** ch
11e30 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65  anging them.  We
11e40 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
11e50 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69   funky casting i
11e60 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
11e70 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
11e80 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20   fields..  */.  
11e90 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
11ea0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
11eb0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
11ec0 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64  dxInfo[1];.  pId
11ed0 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
11ee0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
11ef0 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
11f00 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55  ons[nTerm];.  pU
11f10 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20 73  sage = (struct s
11f20 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
11f30 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26  straint_usage*)&
11f40 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64  pIdxOrderBy[nOrd
11f50 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29  erBy];.  *(int*)
11f60 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
11f70 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
11f80 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
11f90 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
11fa0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
11fb0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11fc0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
11fd0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11fe0 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73  raint = pIdxCons
11ff0 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
12000 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
12010 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
12020 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
12030 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75  rderBy;.  *(stru
12040 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
12050 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
12060 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
12070 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
12080 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
120d0 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
120e0 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
120f0 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
12100 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
12110 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
12120 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
12130 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12140 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
12150 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
12160 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
12170 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
12180 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
12190 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
121a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
121b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
121c0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
121d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
121e0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
121f0 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
12200 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f  inue;.    pIdxCo
12210 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
12220 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
12230 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
12240 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
12250 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f   = i;.    pIdxCo
12260 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70  ns[j].op = (u8)p
12270 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b  Term->eOperator;
12280 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
12290 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
122a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
122b0 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
122c0 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
122d0 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53  ** the WO_ and S
122e0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
122f0 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72  TRAINT_ codes ar
12300 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68  e identical.  Th
12310 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
12320 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
12330 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
12340 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
12350 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
12360 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
12370 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
12380 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
12390 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
123a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
123b0 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LE==SQLITE_INDE
123c0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20  X_CONSTRAINT_LE 
123d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
123e0 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
123f0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
12400 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12410 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GE==SQLITE_IN
12420 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
12430 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
12440 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
12450 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12460 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
12470 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65  assert( pTerm->e
12480 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
12490 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
124a0 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
124b0 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
124c0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
124d0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
124e0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
124f0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12500 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
12510 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
12520 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
12530 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
12540 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
12550 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
12560 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
12570 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
12580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
12590 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
125a0 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
125b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
125c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
125d0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
125e0 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
125f0 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
12600 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
12610 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
12620 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
12630 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
12640 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
12650 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65  ndex_info pointe
12660 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
12670 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  he argument..**.
12680 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12690 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
126a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
126b0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
126c0 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
126d0 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
126e0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
126f0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
12700 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
12710 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
12720 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12730 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
12740 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
12750 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
12760 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
12770 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
12780 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
12790 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
127a0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
127b0 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
127c0 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
127d0 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
127e0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
127f0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
12800 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
12810 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
12820 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
12830 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
12840 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
12850 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
12860 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
12870 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
12880 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
12890 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
128a0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
128b0 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
128c0 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
128d0 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
128e0 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
128f0 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
12900 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
12910 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
12920 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
12930 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
12940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
12950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
12960 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  M ){.      pPars
12970 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12980 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
12990 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a  se if( !pVtab->z
129a0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
129b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
129c0 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71  pParse, "%s", sq
129d0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29  lite3ErrStr(rc))
129e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
129f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12a00 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
12a10 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
12a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
12a30 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
12a40 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
12a50 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
12a60 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
12a70 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
12a80 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
12a90 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
12aa0 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
12ab0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
12ac0 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
12ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12ae0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12af0 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
12b00 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
12b10 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
12b20 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
12b30 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
12b40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61   }..  return pPa
12b50 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f  rse->nErr;.}.../
12b60 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
12b70 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20   best index for 
12b80 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12b90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20  .**.** The best 
12ba0 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65  index is compute
12bb0 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
12bc0 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
12bd0 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
12be0 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73  le module.  This
12bf0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c   routine is real
12c00 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65  ly just a wrappe
12c10 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a  r that sets up.*
12c20 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
12c30 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
12c40 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  re that is used 
12c50 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77  to communicate w
12c60 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ith.** xBestInde
12c70 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f  x..**.** In a jo
12c80 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  in, this routine
12c90 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
12ca0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
12cb0 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  for the.** same 
12cc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
12cd0 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
12ce0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
12cf0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
12d00 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  nd initialized o
12d10 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
12d20 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  cation and reuse
12d30 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75  d on all subsequ
12d40 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ent.** invocatio
12d50 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ns.  The sqlite3
12d60 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12d70 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73  cture is also us
12d80 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  ed when.** code 
12d90 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
12da0 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75  access the virtu
12db0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77  al table.  The w
12dc0 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29  hereInfoDelete()
12dd0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b   .** routine tak
12de0 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  es care of freei
12df0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ng the sqlite3_i
12e00 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12e10 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65  ure after.** eve
12e20 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73  rybody has finis
12e30 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a  hed with it..*/.
12e40 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74  static void best
12e50 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20  VirtualIndex(.  
12e60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
12e90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
12ea0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12ec0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
12ed0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
12ee0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
12ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
12f00 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
12f10 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
12f20 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
12f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12f40 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
12f50 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
12f60 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
12f70 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
12f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12f90 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
12fa0 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
12fb0 20 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20 20   *pCost,        
12fc0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
12fd0 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
12fe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
12ff0 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78  dex_info **ppIdx
13000 49 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69  Info  /* Index i
13010 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
13020 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20  d to xBestIndex 
13030 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
13040 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
13050 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
13060 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
13070 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
13080 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13090 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
130a0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
130b0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
130c0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
130d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
130e0 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
130f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
13100 20 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a    double rCost;.
13110 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13120 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74 69  wsFlags is initi
13130 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73  alized to some s
13140 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65 72  ane value. Other
13150 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20 20  wise, if the .  
13160 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c  ** malloc in all
13170 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 29  ocateIndexInfo()
13180 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20   fails and this 
13190 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
131a0 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73   leaving.  ** ws
131b0 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e  Flags in an unin
131c0 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2c  itialized state,
131d0 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20   the caller may 
131e0 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63 74  behave unpredict
131f0 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ably..  */.  mem
13200 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69  set(pCost, 0, si
13210 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20  zeof(*pCost));. 
13220 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
13230 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
13240 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a  TUALTABLE;..  /*
13250 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   If the sqlite3_
13260 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13270 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  ture has not bee
13280 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a  n previously.  *
13290 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
132a0 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
132b0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  n allocate and i
132c0 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77  nitialize it now
132d0 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  ..  */.  pIdxInf
132e0 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a  o = *ppIdxInfo;.
132f0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
13300 30 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78 49  0 ){.    *ppIdxI
13310 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d  nfo = pIdxInfo =
13320 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
13330 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
13340 70 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29 3b  pSrc, pOrderBy);
13350 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 49  .  }.  if( pIdxI
13360 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nfo==0 ){.    re
13370 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
13380 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
13390 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
133a0 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
133b0 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70 6f  that pIdxInfo po
133c0 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c  ints.  ** to wil
133d0 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74  l have been init
133e0 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72 20  ialized, either 
133f0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
13400 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72  nt invocation or
13410 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d  .  ** during som
13420 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69  e prior invocati
13430 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73 74  on.  Now we just
13440 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d 69   have to customi
13450 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74 61  ze the.  ** deta
13460 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f 20  ils of pIdxInfo 
13470 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
13480 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70  invocation and p
13490 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78  ass it to.  ** x
134a0 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a  BestIndex..  */.
134b0 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65  .  /* The module
134c0 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64 65   name must be de
134d0 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20  fined. Also, by 
134e0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
134f0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
13500 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
13510 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
13520 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  ture. Otherwise.
13530 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65 77    ** sqlite3View
13540 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
13550 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63 6b   would have pick
13560 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72 2e  ed up the error.
13570 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
13580 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
13590 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f  rg && pTab->azMo
135a0 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20  duleArg[0] );.  
135b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
135c0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
135d0 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20  >db, pTab) );.. 
135e0 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
135f0 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
13600 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
13610 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
13620 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
13630 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
13640 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
13650 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
13660 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
13670 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
13680 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
13690 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
136a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
136b0 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
136c0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
136d0 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
136e0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
136f0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
13700 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
13710 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
13720 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
13730 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
13740 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
13750 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
13760 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
13770 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
13780 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
13790 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
137a0 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
137b0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
137c0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
137d0 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
137e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
137f0 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
13800 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
13810 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
13820 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
13830 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
13840 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
13850 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
13860 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
13870 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
13880 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
13890 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
138a0 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
138b0 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
138c0 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
138d0 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
138e0 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
138f0 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
13900 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
13910 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
13920 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
13930 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
13940 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
13950 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
13960 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
13970 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13980 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
13990 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
139a0 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
139b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
139c0 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
139d0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
139e0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
139f0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
13a00 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
13a10 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
13a20 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
13a30 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
13a40 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
13a50 70 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74 52  prereqRight&notR
13a60 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20  eady) ? 0 : 1;. 
13a70 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61   }.  memset(pUsa
13a80 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
13a90 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
13aa0 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
13ab0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
13ac0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
13ad0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
13ae0 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
13af0 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70  idxStr);.  }.  p
13b00 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
13b10 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
13b20 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
13b30 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
13b40 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
13b50 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
13b60 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
13b70 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32 29    /* ((double)2)
13b80 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
13b90 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13ba0 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70  _POINT... */.  p
13bb0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
13bc0 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
13bd0 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62  BIG_DBL / ((doub
13be0 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42  le)2);.  nOrderB
13bf0 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  y = pIdxInfo->nO
13c00 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 70  rderBy;.  if( !p
13c10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70  OrderBy ){.    p
13c20 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
13c30 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  y = 0;.  }..  if
13c40 28 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  ( vtabBestIndex(
13c50 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49  pParse, pTab, pI
13c60 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72  dxInfo) ){.    r
13c70 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49  eturn;.  }..  pI
13c80 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
13c90 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
13ca0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
13cb0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13cc0 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
13cd0 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
13ce0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
13cf0 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
13d00 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
13d10 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
13d20 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78  d |= pWC->a[pIdx
13d30 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  Cons[i].iTermOff
13d40 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68 74  set].prereqRight
13d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13d60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
13d70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13d80 2c 20 61 6e 64 20 74 68 65 20 73 65 6c 65 63 74  , and the select
13d90 65 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ed virtual table
13da0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73   index.  ** does
13db0 20 6e 6f 74 20 73 61 74 69 73 66 79 20 69 74 2c   not satisfy it,
13dc0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 63 6f   increase the co
13dd0 73 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 61  st of the scan a
13de0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 69 73  ccordingly. This
13df0 0a 20 20 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  .  ** matches th
13e00 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
13e10 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 74 61 62   non-virtual tab
13e20 6c 65 73 20 69 6e 20 62 65 73 74 42 74 72 65 65  les in bestBtree
13e30 49 6e 64 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20  Index()..  */.  
13e40 72 43 6f 73 74 20 3d 20 70 49 64 78 49 6e 66 6f  rCost = pIdxInfo
13e50 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b  ->estimatedCost;
13e60 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
13e70 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  && pIdxInfo->ord
13e80 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20  erByConsumed==0 
13e90 29 7b 0a 20 20 20 20 72 43 6f 73 74 20 2b 3d 20  ){.    rCost += 
13ea0 65 73 74 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43  estLog(rCost)*rC
13eb0 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ost;.  }..  /* T
13ec0 68 65 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61  he cost is not a
13ed0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72  llowed to be lar
13ee0 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ger than SQLITE_
13ef0 42 49 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a  BIG_DBL (the.  *
13f00 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f  * inital value o
13f10 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20  f lowestCost in 
13f20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74  this loop. If it
13f30 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
13f40 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43  ** (cost<lowestC
13f50 6f 73 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20  ost) test below 
13f60 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
13f70 75 65 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55  ue..  ** .  ** U
13f80 73 65 20 22 28 64 6f 75 62 6c 65 29 32 22 20 69  se "(double)2" i
13f90 6e 73 74 65 61 64 20 6f 66 20 22 32 2e 30 22 20  nstead of "2.0" 
13fa0 69 6e 20 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f  in case OMIT_FLO
13fb0 41 54 49 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a  ATING_POINT .  *
13fc0 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20  * is defined..  
13fd0 2a 2f 0a 20 20 69 66 28 20 28 53 51 4c 49 54 45  */.  if( (SQLITE
13fe0 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
13ff0 65 29 32 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20  e)2))<rCost ){. 
14000 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
14010 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  = (SQLITE_BIG_DB
14020 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a  L/((double)2));.
14030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
14040 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73  st->rCost = rCos
14050 74 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e  t;.  }.  pCost->
14060 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 20  plan.u.pVtabIdx 
14070 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66  = pIdxInfo;.  if
14080 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  ( pIdxInfo->orde
14090 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20  rByConsumed ){. 
140a0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
140b0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
140c0 4f 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70  ORDERBY;.  }.  p
140d0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  Cost->plan.nEq =
140e0 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
140f0 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
14100 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  rBy;..  /* Try t
14110 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65 66  o find a more ef
14120 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20 70  ficient access p
14130 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67 20  attern by using 
14140 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65 73  multiple indexes
14150 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  .  ** to optimiz
14160 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73 69  e an OR expressi
14170 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57 48  on within the WH
14180 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a  ERE clause. .  *
14190 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65  /.  bestOrClause
141a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
141b0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
141c0 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f  y, pOrderBy, pCo
141d0 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
141e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
141f0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
14200 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64  .** Argument pId
14210 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  x is a pointer t
14220 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  o an index struc
14230 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61 6e  ture that has an
14240 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51 4c   array of.** SQL
14250 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
14260 53 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20  S evenly spaced 
14270 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 66  samples of the f
14280 69 72 73 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  irst indexed col
14290 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  umn.** stored in
142a0 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e 20   Index.aSample. 
142b0 54 68 65 20 64 6f 6d 61 69 6e 20 6f 66 20 76 61  The domain of va
142c0 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 73  lues stored in s
142d0 61 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6d 61  aid column.** ma
142e0 79 20 62 65 20 74 68 6f 75 67 68 74 20 6f 66 20  y be thought of 
142f0 61 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  as divided into 
14300 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  (SQLITE_INDEX_SA
14310 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e 73  MPLES+1) regions
14320 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63 6f  ..** Region 0 co
14330 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65  ntains all value
14340 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
14350 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
14360 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a 2a  value. Region.**
14370 20 31 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75   1 contains valu
14380 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f  es larger than o
14390 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 76  r equal to the v
143a0 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72 73  alue of the firs
143b0 74 20 73 61 6d 70 6c 65 2c 0a 2a 2a 20 62 75 74  t sample,.** but
143c0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
143d0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
143e0 65 63 6f 6e 64 2e 20 41 6e 64 20 73 6f 20 6f 6e  econd. And so on
143f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14400 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
14410 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
14420 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65 67  which of the reg
14430 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70  ions value .** p
14440 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65 74  Val lies in, set
14450 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20 74  s *piRegion to t
14460 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78 20  he region index 
14470 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  (a value between
14480 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45   0.** and SQLITE
14490 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
144a0 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e 64  , inclusive) and
144b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
144c0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  OK..** Or, if an
144d0 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69 6c   OOM occurs whil
144e0 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65 78  e converting tex
144f0 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
14500 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20 53   encodings,.** S
14510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
14520 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69 52  eturned and *piR
14530 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69 6e  egion is undefin
14540 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14550 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14560 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  2.static int whe
14570 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a 20  reRangeRegion(. 
14580 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145a0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
145b0 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
145c0 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
145d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
145e0 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
145f0 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   of */.  sqlite3
14600 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20  _value *pVal,   
14610 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
14620 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
14630 6e 74 20 2a 70 69 52 65 67 69 6f 6e 20 20 20 20  nt *piRegion    
14640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14650 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64 6f 6d  T: Region of dom
14660 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76 61 6c  ain in which val
14670 75 65 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20 20  ue lies */.){.  
14680 69 66 28 20 41 4c 57 41 59 53 28 70 56 61 6c 29  if( ALWAYS(pVal)
14690 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d   ){.    IndexSam
146a0 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
146b0 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
146c0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
146d0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
146e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
146f0 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20  pVal);..    if( 
14700 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
14710 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d  TEGER || eType==
14720 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
14730 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
14740 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
14750 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
14760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
14770 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
14780 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ES; i++){.      
14790 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
147a0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
147b0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
147c0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
147d0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
147e0 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53 61  LITE_TEXT || aSa
147f0 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29 20  mple[i].u.r>r ) 
14800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14810 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
14820 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14830 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
14840 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
14850 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
14860 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  *z;.      int n;
14870 0a 0a 20 20 20 20 20 20 2f 2a 20 70 56 61 6c 20  ..      /* pVal 
14880 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  comes from sqlit
14890 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
148a0 29 20 73 6f 20 74 68 65 20 74 79 70 65 20 63 61  ) so the type ca
148b0 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
148c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
148d0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
148e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
148f0 45 5f 42 4c 4f 42 20 29 3b 0a 0a 20 20 20 20 20  E_BLOB );..     
14900 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
14910 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
14920 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
14930 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
14940 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20  _blob(pVal);.   
14950 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
14960 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
14970 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
14980 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  l->enc==SQLITE_U
14990 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  TF8 );.      }el
149a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
149b0 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
149c0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
149d0 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d  _UTF8, 0, *pIdx-
149e0 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  >azColl);.      
149f0 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
14a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14a10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14a20 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
14a30 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
14a40 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  *pIdx->azColl);.
14a70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14a80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14aa0 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
14ab0 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78  )sqlite3ValueTex
14ac0 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  t(pVal, pColl->e
14ad0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
14ae0 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20   !z ){.         
14af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14b00 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
14b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14b20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43  z && pColl && pC
14b30 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20  oll->xCmp );.   
14b40 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73     }.      n = s
14b50 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73  qlite3ValueBytes
14b60 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
14b70 63 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  c);..      for(i
14b80 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44  =0; i<SQLITE_IND
14b90 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29  EX_SAMPLES; i++)
14ba0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b  {.        int r;
14bb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61  .        int eSa
14bc0 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70  mpletype = aSamp
14bd0 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20  le[i].eType;.   
14be0 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65       if( eSample
14bf0 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  type==SQLITE_NUL
14c00 4c 20 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70 65  L || eSampletype
14c10 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75  <eType ) continu
14c20 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
14c30 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79  eSampletype!=eTy
14c40 70 65 29 20 29 20 62 72 65 61 6b 3b 0a 23 69 66  pe) ) break;.#if
14c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14c60 5f 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69  _UTF16.        i
14c70 66 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53  f( pColl->enc!=S
14c80 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
14c90 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d          int nSam
14ca0 70 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ple;.          c
14cb0 68 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73  har *zSample = s
14cc0 71 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a  qlite3Utf8to16(.
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
14ce0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53  , pColl->enc, aS
14cf0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53  ample[i].u.z, aS
14d00 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20  ample[i].nByte, 
14d10 26 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20  &nSample.       
14d20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
14d30 69 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a  if( !zSample ){.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14d50 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
14d60 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
14d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14d80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
14d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
14da0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
14db0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61  Coll->pUser, nSa
14dc0 6d 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e  mple, zSample, n
14dd0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
14de0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14df0 2c 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  , zSample);.    
14e00 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
14e10 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
14e20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d 3e       r = pColl->
14e30 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
14e40 72 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  r, aSample[i].nB
14e50 79 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  yte, aSample[i].
14e60 75 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  u.z, n, z);.    
14e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14e80 28 20 72 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  ( r>0 ) break;. 
14e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
14ea0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
14eb0 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  & i<=SQLITE_INDE
14ec0 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
14ed0 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a   *piRegion = i;.
14ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14ef0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
14f00 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
14f10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
14f20 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
14f30 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
14f40 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
14f50 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
14f60 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
14f70 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
14f80 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
14f90 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
14fa0 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
14fb0 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
14fc0 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
14fd0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
14fe0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
14ff0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
15000 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
15010 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
15020 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
15030 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
15040 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
15050 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
15060 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
15070 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
15080 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
15090 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
150a0 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
150b0 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
150c0 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
150d0 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
150e0 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
150f0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
15100 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
15110 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
15120 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
15130 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
15140 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
15150 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
15160 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
15170 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
15180 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
15190 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
151a0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
151b0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
151c0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
151d0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
151e0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
151f0 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
15200 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
15210 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
15220 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
15230 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
15240 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
15250 20 2f 2a 20 54 68 65 20 65 76 61 6c 43 6f 6e 73   /* The evalCons
15260 74 45 78 70 72 28 29 20 66 75 6e 63 74 69 6f 6e  tExpr() function
15270 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
15280 64 79 20 63 6f 6e 76 65 72 74 65 64 20 61 6e 79  dy converted any
15290 20 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 2a   TK_VARIABLE.  *
152a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 76  * expression inv
152b0 6f 6c 76 65 64 20 69 6e 20 61 6e 20 63 6f 6d 70  olved in an comp
152c0 61 72 69 73 6f 6e 20 69 6e 74 6f 20 61 20 54 4b  arison into a TK
152d0 5f 52 45 47 49 53 54 45 52 2e 20 2a 2f 0a 20 20  _REGISTER. */.  
152e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
152f0 70 21 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p!=TK_VARIABLE )
15300 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
15310 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
15320 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  & pExpr->op2==TK
15330 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
15340 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70   int iVar = pExp
15350 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
15360 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
15370 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
15380 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
15390 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *pp = sqlite3Vdb
153a0 65 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eGetValue(pParse
153b0 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
153c0 61 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65  ar, aff);.    re
153d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
153e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
153f0 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
15400 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
15410 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  xpr, SQLITE_UTF8
15420 2c 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65  , aff, pp);.}.#e
15430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
15440 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
15450 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
15460 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
15470 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
15480 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
15490 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
154a0 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
154b0 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
154c0 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
154d0 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
154e0 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
154f0 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
15500 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
15510 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
15520 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
15530 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
15540 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
15550 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
15560 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
15570 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
15580 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
15590 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
155a0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
155b0 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
155c0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
155d0 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
155e0 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
15610 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
15620 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
15630 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
15640 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
15650 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
15660 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
15670 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
15680 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
15690 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
156a0 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
156b0 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
156c0 6e 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73  nEq parameter is
156d0 20 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65   passed the inde
156e0 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  x of the index c
156f0 6f 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f  olumn subject to
15700 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f   the.** range co
15710 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71  nstraint. Or, eq
15720 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20  uivalently, the 
15730 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
15740 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ty constraints.*
15750 2a 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74  * optimized by t
15760 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65  he proposed inde
15770 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d  x scan. For exam
15780 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e  ple, assuming in
15790 64 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74  dex p is.** on t
157a0 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65  1(a, b), and the
157b0 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a   SQL query is:.*
157c0 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
157d0 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41  t1 WHERE a = ? A
157e0 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c  ND b > ? AND b <
157f0 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
15800 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
15810 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
15820 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
15830 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
15840 6d 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65  mn,.** b, is the
15850 20 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73   second left-mos
15860 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
15870 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74  index). Or, if t
15880 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
15890 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
158a0 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44   WHERE a > ? AND
158b0 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   a < ? ....**.**
158c0 20 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64   then nEq should
158d0 20 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a   be passed 0..**
158e0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
158f0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74   value is an int
15900 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61  eger between 1 a
15910 6e 64 20 31 30 30 2c 20 69 6e 63 6c 75 73 69 76  nd 100, inclusiv
15920 65 2e 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20 76  e. A return.** v
15930 61 6c 75 65 20 6f 66 20 31 20 69 6e 64 69 63 61  alue of 1 indica
15940 74 65 73 20 74 68 61 74 20 74 68 65 20 70 72 6f  tes that the pro
15950 70 6f 73 65 64 20 72 61 6e 67 65 20 73 63 61 6e  posed range scan
15960 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
15970 76 69 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78 69  visit.** approxi
15980 6d 61 74 65 6c 79 20 31 2f 31 30 30 74 68 20 28  mately 1/100th (
15990 31 25 29 20 6f 66 20 74 68 65 20 72 6f 77 73 20  1%) of the rows 
159a0 73 65 6c 65 63 74 65 64 20 62 79 20 74 68 65 20  selected by the 
159b0 6e 45 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  nEq equality.** 
159c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 69 66 20  constraints (if 
159d0 61 6e 79 29 2e 20 41 20 72 65 74 75 72 6e 20 76  any). A return v
159e0 61 6c 75 65 20 6f 66 20 31 30 30 20 69 6e 64 69  alue of 100 indi
159f0 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69 73  cates that it is
15a00 20 65 78 70 65 63 74 65 64 0a 2a 2a 20 74 68 61   expected.** tha
15a10 74 20 74 68 65 20 72 61 6e 67 65 20 73 63 61 6e  t the range scan
15a20 20 77 69 6c 6c 20 76 69 73 69 74 20 65 76 65 72   will visit ever
15a30 79 20 72 6f 77 20 28 31 30 30 25 29 20 73 65 6c  y row (100%) sel
15a40 65 63 74 65 64 20 62 79 20 74 68 65 20 65 71 75  ected by the equ
15a50 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
15a60 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ints..**.** In t
15a70 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
15a80 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c 59  lite_stat2 ANALY
15a90 5a 45 20 64 61 74 61 2c 20 65 61 63 68 20 72 61  ZE data, each ra
15aa0 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a  nge inequality.*
15ab0 2a 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  * reduces the se
15ac0 61 72 63 68 20 73 70 61 63 65 20 62 79 20 32 2f  arch space by 2/
15ad0 33 72 64 73 2e 20 20 48 65 6e 63 65 20 61 20 73  3rds.  Hence a s
15ae0 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
15af0 20 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74   (x>?).** result
15b00 73 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  s in a return of
15b10 20 33 33 20 61 6e 64 20 61 20 72 61 6e 67 65 20   33 and a range 
15b20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20  constraint (x>? 
15b30 41 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73  AND x<?) results
15b40 0a 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20  .** in a return 
15b50 6f 66 20 31 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  of 11..*/.static
15b60 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53   int whereRangeS
15b70 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
15b80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
15b90 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
15ba0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
15bb0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
15bc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15bd0 20 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   The index conta
15be0 69 6e 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d  ining the range-
15bf0 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b  compared column;
15c00 20 22 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45   "x" */.  int nE
15c10 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
15c20 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e  * index into p->
15c30 61 43 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61  aCol[] of the ra
15c40 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c  nge-compared col
15c50 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  umn */.  WhereTe
15c60 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a  rm *pLower,   /*
15c70 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Lower bound on 
15c80 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
15c90 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20  x>123" Might be 
15ca0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54  NULL */.  WhereT
15cb0 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f  erm *pUpper,   /
15cc0 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  * Upper bound on
15cd0 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
15ce0 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65  "x<455" Might be
15cf0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a   NULL */.  int *
15d00 70 69 45 73 74 20 20 20 20 20 20 20 20 20 20 20  piEst           
15d10 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 76  /* OUT: Return v
15d20 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  alue */.){.  int
15d30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15d40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15d50 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20  ENABLE_STAT2..  
15d60 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d  if( nEq==0 && p-
15d70 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >aSample ){.    
15d80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15d90 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20  LowerVal = 0;.  
15da0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15db0 2a 70 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a  *pUpperVal = 0;.
15dc0 20 20 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20      int iEst;.  
15dd0 20 20 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30    int iLower = 0
15de0 3b 0a 20 20 20 20 69 6e 74 20 69 55 70 70 65 72  ;.    int iUpper
15df0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   = SQLITE_INDEX_
15e00 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 75 38 20  SAMPLES;.    u8 
15e10 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
15e20 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
15e30 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  n[0]].affinity;.
15e40 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20  .    if( pLower 
15e50 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
15e60 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
15e70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
15e80 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
15e90 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
15ea0 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77  Expr, aff, &pLow
15eb0 65 72 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  erVal);.    }.  
15ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ed0 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b  _OK && pUpper ){
15ee0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15ef0 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
15f00 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
15f10 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
15f20 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
15f30 70 72 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72  pr, aff, &pUpper
15f40 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Val);.    }..   
15f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15f60 4f 4b 20 7c 7c 20 28 70 4c 6f 77 65 72 56 61 6c  OK || (pLowerVal
15f70 3d 3d 30 20 26 26 20 70 55 70 70 65 72 56 61 6c  ==0 && pUpperVal
15f80 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ==0) ){.      sq
15f90 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
15fa0 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20  LowerVal);.     
15fb0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
15fc0 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20  e(pUpperVal);.  
15fd0 20 20 20 20 67 6f 74 6f 20 72 61 6e 67 65 5f 65      goto range_e
15fe0 73 74 5f 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  st_fallback;.   
15ff0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 77 65   }else if( pLowe
16000 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rVal==0 ){.     
16010 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
16020 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
16030 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 26 69 55  , pUpperVal, &iU
16040 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pper);.      if(
16050 20 70 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72   pLower ) iLower
16060 20 3d 20 69 55 70 70 65 72 2f 32 3b 0a 20 20 20   = iUpper/2;.   
16070 20 7d 65 6c 73 65 20 69 66 28 20 70 55 70 70 65   }else if( pUppe
16080 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rVal==0 ){.     
16090 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
160a0 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
160b0 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69 4c  , pLowerVal, &iL
160c0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ower);.      if(
160d0 20 70 55 70 70 65 72 20 29 20 69 55 70 70 65 72   pUpper ) iUpper
160e0 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20 53 51 4c   = (iLower + SQL
160f0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
16100 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d 65  S + 1)/2;.    }e
16110 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16120 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
16130 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70  (pParse, p, pUpp
16140 65 72 56 61 6c 2c 20 26 69 55 70 70 65 72 29 3b  erVal, &iUpper);
16150 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16170 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
16180 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65  ngeRegion(pParse
16190 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20  , p, pLowerVal, 
161a0 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20  &iLower);.      
161b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 45 73  }.    }..    iEs
161c0 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f  t = iUpper - iLo
161d0 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63 61 73  wer;.    testcas
161e0 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54 45 5f  e( iEst==SQLITE_
161f0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b  INDEX_SAMPLES );
16200 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 45 73  .    assert( iEs
16210 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  t<=SQLITE_INDEX_
16220 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 69  SAMPLES );.    i
16230 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20 20 20  f( iEst<1 ){.   
16240 20 20 20 69 45 73 74 20 3d 20 31 3b 0a 20 20 20     iEst = 1;.   
16250 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56   }..    sqlite3V
16260 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56  alueFree(pLowerV
16270 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
16280 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72  ValueFree(pUpper
16290 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 45 73 74  Val);.    *piEst
162a0 20 3d 20 28 69 45 73 74 20 2a 20 31 30 30 29 2f   = (iEst * 100)/
162b0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
162c0 50 4c 45 53 3b 0a 20 20 20 20 72 65 74 75 72 6e  PLES;.    return
162d0 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f 65   rc;.  }.range_e
162e0 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65 6c  st_fallback:.#el
162f0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
16300 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
16310 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
16320 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
16330 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23  ARAMETER(nEq);.#
16340 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
16350 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
16360 20 29 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72   );.  if( pLower
16370 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20   && pUpper ){.  
16380 20 20 2a 70 69 45 73 74 20 3d 20 31 31 3b 0a 20    *piEst = 11;. 
16390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 45   }else{.    *piE
163a0 73 74 20 3d 20 33 33 3b 0a 20 20 7d 0a 20 20 72  st = 33;.  }.  r
163b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
163c0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
163d0 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
163e0 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
163f0 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ar table.  Write
16400 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
16410 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
16420 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68  cost into the Wh
16430 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73  ereCost object s
16440 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a  upplied as the.*
16450 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72  * last parameter
16460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65  ..**.** The lowe
16470 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e  st cost plan win
16480 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20  s.  The cost is 
16490 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
164a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20  he amount of.** 
164b0 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f  CPU and disk I/O
164c0 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73   need to process
164d0 20 74 68 65 20 72 65 71 75 65 73 74 20 75 73 69   the request usi
164e0 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  ng the selected 
164f0 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  plan..** Factors
16500 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
16510 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
16520 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
16530 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
16540 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
16550 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
16560 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
16570 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
16580 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
16590 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
165a0 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
165b0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
165c0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
165d0 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
165e0 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
165f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
16600 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
16610 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
16620 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
16630 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 28  EXED BY clause (
16640 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74  pSrc->pIndex) at
16650 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
16660 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51  ble in.** the SQ
16670 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  L statement, the
16680 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16690 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70  only considers p
166a0 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a  lans using the .
166b0 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ** named index. 
166c0 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20  If no such plan 
166d0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  is found, then t
166e0 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74  he returned cost
166f0 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49   is.** SQLITE_BI
16700 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e  G_DBL. If a plan
16710 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75   is found that u
16720 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ses the named in
16730 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68  dex, .** then th
16740 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c  e cost is calcul
16750 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61  ated in the usua
16760 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l way..**.** If 
16770 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  a NOT INDEXED cl
16780 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49  ause (pSrc->notI
16790 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20 61  ndexed!=0) was a
167a0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
167b0 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  able .** in the 
167c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
167d0 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
167e0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
167f0 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a  . However, the .
16800 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e  ** selected plan
16810 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20   may still take 
16820 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
16830 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e   tables built-in
16840 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e   rowid.** index.
16850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16860 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 0a  bestBtreeIndex(.
16870 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16890 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
168a0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
168b0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
168c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
168d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
168e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
168f0 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
16900 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
16910 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
16920 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
16930 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
16940 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
16950 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
16960 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
16970 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
16980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16990 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
169a0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
169b0 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
169c0 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
169d0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
169e0 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
169f0 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
16a00 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
16a10 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
16a20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
16a30 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
16a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16a50 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
16a60 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
16a70 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
16a80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
16a90 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a   of pProbe, or z
16aa0 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65  ero for IPK inde
16ab0 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  x */.  int eqTer
16ac0 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
16ad0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61     /* Current ma
16ae0 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
16af0 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
16b00 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72  /.  int idxEqTer
16b10 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
16b20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66  /* Index mask of
16b30 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
16b40 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49  operators */.  I
16b50 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
16b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16b70 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
16b80 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
16b90 79 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67  y key */.  unsig
16ba0 6e 65 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74  ned int aiRowEst
16bb0 50 6b 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69  Pk[2]; /* The ai
16bc0 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
16bd0 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
16be0 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
16bf0 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
16c00 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
16c10 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
16c20 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
16c30 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20  int wsFlagMask; 
16c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16c50 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20  llowed flags in 
16c60 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
16c70 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  ag */..  /* Init
16c80 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20  ialize the cost 
16c90 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20  to a worst-case 
16ca0 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  value */.  memse
16cb0 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
16cc0 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
16cd0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
16ce0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
16cf0 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
16d00 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
16d10 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
16d20 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
16d30 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
16d40 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
16d50 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
16d60 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
16d70 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
16d80 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
16d90 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
16da0 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
16db0 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
16dc0 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
16dd0 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
16de0 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
16df0 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
16e00 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
16e10 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
16e20 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
16e30 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
16e40 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
16e50 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
16e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
16e70 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
16e80 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
16e90 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
16ea0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
16eb0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
16ec0 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
16ed0 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
16ee0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
16ef0 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72  /.    pIdx = pPr
16f00 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
16f10 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  ex;.    wsFlagMa
16f20 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
16f30 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
16f40 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
16f50 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
16f60 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73  TermMask;.  }els
16f70 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
16f80 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
16f90 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
16fa0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
16fb0 6a 65 63 74 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ject to.    ** r
16fc0 65 70 72 65 73 65 6e 74 20 74 68 65 20 70 72 69  epresent the pri
16fd0 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
16fe0 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17000 20 41 6e 79 20 6f 74 68 65 72 20 69 6e 64 65 78   Any other index
17010 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   on the table */
17020 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b  .    memset(&sPk
17030 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65  , 0, sizeof(Inde
17040 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f  x));.    sPk.nCo
17050 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50  lumn = 1;.    sP
17060 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69  k.aiColumn = &ai
17070 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50  ColumnPk;.    sP
17080 6b 2e 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52  k.aiRowEst = aiR
17090 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 61 69 52  owEstPk;.    aiR
170a0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
170b0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
170c0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
170d0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
170e0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70  Src->pTab;.    p
170f0 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
17100 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
17110 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
17120 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
17130 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
17140 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rst;.    }.    /
17150 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 50 6b  * The aiRowEstPk
17160 5b 30 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [0] is an estima
17170 74 65 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  te of the total 
17180 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
17190 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  n the.    ** tab
171a0 6c 65 2e 20 20 47 65 74 20 74 68 69 73 20 69 6e  le.  Get this in
171b0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
171c0 68 65 20 41 4e 41 4c 59 5a 45 20 69 6e 66 6f 72  he ANALYZE infor
171d0 6d 61 74 69 6f 6e 20 69 66 20 69 74 20 69 73 0a  mation if it is.
171e0 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65      ** available
171f0 2e 20 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61  .  If not availa
17200 62 6c 65 2c 20 61 73 73 75 6d 65 20 74 68 65 20  ble, assume the 
17210 74 61 62 6c 65 20 31 20 6d 69 6c 6c 69 6f 6e 20  table 1 million 
17220 72 6f 77 73 20 69 6e 20 73 69 7a 65 2e 0a 20 20  rows in size..  
17230 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
17240 72 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rst ){.      ass
17250 65 72 74 28 20 70 46 69 72 73 74 2d 3e 61 69 52  ert( pFirst->aiR
17260 6f 77 45 73 74 21 3d 30 20 29 3b 20 2f 2a 20 41  owEst!=0 ); /* A
17270 6c 6c 6f 63 61 74 65 64 20 74 6f 67 65 74 68 65  llocated togethe
17280 72 20 77 69 74 68 20 70 46 69 72 73 74 20 2a 2f  r with pFirst */
17290 0a 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 50  .      aiRowEstP
172a0 6b 5b 30 5d 20 3d 20 70 46 69 72 73 74 2d 3e 61  k[0] = pFirst->a
172b0 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
172c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 69 52  }else{.      aiR
172d0 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 31 30 30  owEstPk[0] = 100
172e0 30 30 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0000;.    }.    
172f0 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
17300 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20     wsFlagMask = 
17310 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ~(.        WHERE
17320 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
17330 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
17340 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45  _COLUMN_NULL|WHE
17350 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a  RE_COLUMN_RANGE.
17360 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72      );.    eqTer
17370 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
17380 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  _IN;.    pIdx = 
17390 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  0;.  }..  /* Loo
173a0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
173b0 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74  es looking for t
173c0 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20 75  he best one to u
173d0 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  se.  */.  for(; 
173e0 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50 72  pProbe; pIdx=pPr
173f0 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
17400 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  t){.    const un
17410 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f 6e  signed int * con
17420 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50  st aiRowEst = pP
17430 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  robe->aiRowEst;.
17440 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
17470 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64   pProbe */.    d
17480 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20  ouble nRow;     
17490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
174a0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
174b0 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74  f rows in result
174c0 20 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20   set */.    int 
174d0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
174e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
174f0 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
17500 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
17510 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 30 3b  int wsFlags = 0;
17520 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65  .    Bitmask use
17530 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54  d = 0;..    /* T
17540 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
17550 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
17560 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
17570 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 0a  e properties of.
17580 20 20 20 20 2a 2a 20 73 63 61 6e 20 62 65 69 6e      ** scan bein
17590 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65  g evaluated. The
175a0 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64 20  y are then used 
175b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
175c0 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a   expected.    **
175d0 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72   cost and number
175e0 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
175f0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
17600 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20    nEq: .    **  
17610 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61    Number of equa
17620 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61 74 20  lity terms that 
17630 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  can be implement
17640 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
17650 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
17660 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20  *  nInMul:  .   
17670 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d   **    The "in-m
17680 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73  ultiplier". This
17690 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
176a0 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b  of how many seek
176b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20   operations .   
176c0 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
176d0 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68  st perform on th
176e0 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74  e index in quest
176f0 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
17700 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
17710 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65      WHERE clause
17720 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   is:.    **.    
17730 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
17740 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44  IN (1, 2, 3) AND
17750 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a   b IN (4, 5, 6).
17760 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
17770 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
17780 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f  form 9 lookups o
17790 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  n an index on (a
177a0 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20  , b), so nInMul 
177b0 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65  is .    **    se
177c0 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68  t to 9. Given th
177d0 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e  e same schema an
177e0 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  d either of the 
177f0 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20  following WHERE 
17800 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73  .    **    claus
17810 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
17820 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d  *      WHERE a =
17830 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20    1.    **      
17840 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20  WHERE a >= 2.   
17850 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49   **.    **    nI
17860 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31  nMul is set to 1
17870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17880 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73     If there exis
17890 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20  ts a WHERE term 
178a0 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49  of the form "x I
178b0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c  N (SELECT ...)",
178c0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20   then .    **   
178d0 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
178e0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65  is assumed to re
178f0 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72  turn 25 rows for
17900 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
17910 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65   .    **    dete
17920 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a  rmining nInMul..
17930 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
17940 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20  InEst:  .    ** 
17950 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69     Set to true i
17960 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c  f there was at l
17970 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28  east one "x IN (
17980 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72  SELECT ...)" ter
17990 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20  m used .    **  
179a0 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67    in determining
179b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49   the value of nI
179c0 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nMul..    **.   
179d0 20 2a 2a 20 20 65 73 74 42 6f 75 6e 64 3a 0a 20   **  estBound:. 
179e0 20 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69     **    An esti
179f0 6d 61 74 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75  mate on the amou
17a00 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  nt of the table 
17a10 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 65 61  that must be sea
17a20 72 63 68 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a  rched.  A.    **
17a30 20 20 20 20 76 61 6c 75 65 20 6f 66 20 31 30 30      value of 100
17a40 20 6d 65 61 6e 73 20 74 68 65 20 65 6e 74 69 72   means the entir
17a50 65 20 74 61 62 6c 65 20 69 73 20 73 65 61 72 63  e table is searc
17a60 68 65 64 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73  hed.  Range cons
17a70 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20  traints.    **  
17a80 20 20 6d 69 67 68 74 20 72 65 64 75 63 65 20 74    might reduce t
17a90 68 69 73 20 74 6f 20 61 20 76 61 6c 75 65 20 6c  his to a value l
17aa0 65 73 73 20 74 68 61 6e 20 31 30 30 20 74 6f 20  ess than 100 to 
17ab0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6f 6e  indicate that on
17ac0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 61 20 66  ly.    **    a f
17ad0 72 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  raction of the t
17ae0 61 62 6c 65 20 6e 65 65 64 73 20 73 65 61 72 63  able needs searc
17af0 68 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 61 62  hing.  In the ab
17b00 73 65 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20  sence of.    ** 
17b10 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20     sqlite_stat2 
17b20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 61 20  ANALYZE data, a 
17b30 73 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74  single inequalit
17b40 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
17b50 61 72 63 68 0a 20 20 20 20 2a 2a 20 20 20 20 73  arch.    **    s
17b60 70 61 63 65 20 74 6f 20 31 2f 33 72 64 20 69 74  pace to 1/3rd it
17b70 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
17b80 20 20 53 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73    So an x>? cons
17b90 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 0a 20  traint reduces. 
17ba0 20 20 20 2a 2a 20 20 20 20 65 73 74 42 6f 75 6e     **    estBoun
17bb0 64 20 74 6f 20 33 33 2e 20 20 54 77 6f 20 63 6f  d to 33.  Two co
17bc0 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41  nstraints (x>? A
17bd0 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65 20 65  ND x<?) reduce e
17be0 73 74 42 6f 75 6e 64 20 74 6f 20 31 31 2e 0a 20  stBound to 11.. 
17bf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53     **.    **  bS
17c00 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20  ort:   .    **  
17c10 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
17c20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
17c30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
17c40 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
17c50 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65   an .    **    e
17c60 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e  xternal sort (i.
17c70 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20  e. scanning the 
17c80 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c  index being eval
17c90 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a  uated will not .
17ca0 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63      **    correc
17cb0 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64  tly order record
17cc0 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
17cd0 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20  *  bLookup: .   
17ce0 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20   **    Boolean. 
17cf0 54 72 75 65 20 69 66 20 66 6f 72 20 65 61 63 68  True if for each
17d00 20 69 6e 64 65 78 20 65 6e 74 72 79 20 76 69 73   index entry vis
17d10 69 74 65 64 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e  ited a lookup on
17d20 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
17d30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
17d40 62 6c 65 20 62 2d 74 72 65 65 20 69 73 20 72 65  ble b-tree is re
17d50 71 75 69 72 65 64 2e 20 54 68 69 73 20 69 73 20  quired. This is 
17d60 61 6c 77 61 79 73 20 66 61 6c 73 65 20 0a 20 20  always false .  
17d70 20 20 2a 2a 20 20 20 20 66 6f 72 20 74 68 65 20    **    for the 
17d80 72 6f 77 69 64 20 69 6e 64 65 78 2e 20 46 6f 72  rowid index. For
17d90 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20   other indexes, 
17da0 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73  it is true unles
17db0 73 20 61 6c 6c 20 74 68 65 20 0a 20 20 20 20 2a  s all the .    *
17dc0 2a 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  *    columns of 
17dd0 74 68 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  the table used b
17de0 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
17df0 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65  tement are prese
17e00 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 20 20  nt in .    **   
17e10 20 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68   the index (such
17e20 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 6f 6d   an index is som
17e30 65 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64  etimes described
17e40 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
17e50 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20  ndex)..    **   
17e60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69   For example, gi
17e70 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ven the index on
17e80 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63   (a, b), the sec
17e90 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ond of the follo
17ea0 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20  wing .    **    
17eb0 74 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75  two queries requ
17ec0 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65  ires table b-tre
17ed0 65 20 6c 6f 6f 6b 75 70 73 2c 20 62 75 74 20 74  e lookups, but t
17ee0 68 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f  he first does no
17ef0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c               SEL
17f10 45 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d  ECT a, b    FROM
17f20 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
17f30 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ;.    **        
17f40 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
17f50 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  , c FROM tbl WHE
17f60 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f  RE a = 1;.    */
17f70 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 0a 20 20  .    int nEq;.  
17f80 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30    int bInEst = 0
17f90 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c  ;.    int nInMul
17fa0 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 73   = 1;.    int es
17fb0 74 42 6f 75 6e 64 20 3d 20 31 30 30 3b 0a 20 20  tBound = 100;.  
17fc0 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30    int nBound = 0
17fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17fe0 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65   Number of range
17ff0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65   constraints see
18000 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f  n */.    int bSo
18010 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  rt = 0;.    int 
18020 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 0a 20 20 20  bLookup = 0;.   
18030 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
18040 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
18050 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
18060 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18070 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 65 74  e */..    /* Det
18080 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
18090 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e  s of nEq and nIn
180a0 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  Mul */.    for(n
180b0 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65  Eq=0; nEq<pProbe
180c0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b  ->nColumn; nEq++
180d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
180e0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
180f0 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54  n[nEq];.      pT
18100 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
18110 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
18120 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
18130 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
18140 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
18150 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c  reak;.      wsFl
18160 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
18170 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
18180 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69  WID_EQ);.      i
18190 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
181a0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
181b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
181c0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
181d0 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  r;.        wsFla
181e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
181f0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
18200 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18210 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
18220 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
18230 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32       nInMul *= 2
18240 35 3b 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e  5;.          bIn
18250 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Est = 1;.       
18260 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
18270 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
18280 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
18290 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e  InMul *= pExpr->
182a0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  x.pList->nExpr +
182b0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
182c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
182d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
182e0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
182f0 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
18300 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55   WHERE_COLUMN_NU
18310 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
18320 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d    used |= pTerm-
18330 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
18340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65    }..    /* Dete
18350 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20  rmine the value 
18360 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a 2f 0a  of estBound. */.
18370 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f      if( nEq<pPro
18380 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  be->nColumn ){. 
18390 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
183a0 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  obe->aiColumn[nE
183b0 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69  q];.      if( fi
183c0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
183d0 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
183e0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
183f0 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b  |WO_GE, pIdx) ){
18400 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
18410 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54  rm *pTop = findT
18420 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
18430 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
18440 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a  T|WO_LE, pIdx);.
18450 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
18460 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54 65  m *pBtm = findTe
18470 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
18480 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
18490 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20  |WO_GE, pIdx);. 
184a0 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67         whereRang
184b0 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
184c0 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42   pProbe, nEq, pB
184d0 74 6d 2c 20 70 54 6f 70 2c 20 26 65 73 74 42 6f  tm, pTop, &estBo
184e0 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  und);.        if
184f0 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20  ( pTop ){.      
18500 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a      nBound = 1;.
18510 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67            wsFlag
18520 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
18530 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
18540 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72  used |= pTop->pr
18550 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
18560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18570 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20   pBtm ){.       
18580 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20     nBound++;.   
18590 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
185a0 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
185b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73 65  T;.          use
185c0 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65  d |= pBtm->prere
185d0 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
185e0 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  }.        wsFlag
185f0 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55  s |= (WHERE_COLU
18600 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52  MN_RANGE|WHERE_R
18610 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
18620 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
18630 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
18640 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
18650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
18660 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
18670 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20  OLUMN_IN );.    
18680 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
18690 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
186a0 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  MN_NULL );.     
186b0 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
186c0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
186d0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
186e0 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  LL))==0 ){.     
186f0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
18700 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
18710 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18720 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
18730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18740 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62   and the index b
18750 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
18760 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75  will.    ** natu
18770 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20  rally scan rows 
18780 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20  in the required 
18790 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 61  order, set the a
187a0 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73  ppropriate flags
187b0 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61  .    ** in wsFla
187c0 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  gs. Otherwise, i
187d0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
187e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 75  DER BY clause bu
187f0 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  t the index.    
18800 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ** will scan row
18810 73 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  s in a different
18820 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20   order, set the 
18830 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65 2e 20  bSort variable. 
18840 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
18850 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
18860 28 20 28 77 73 46 6c 61 67 73 20 26 20 28 57 48  ( (wsFlags & (WH
18870 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
18880 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
18890 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
188a0 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  isSortingIndex(p
188b0 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b  Parse,pWC->pMask
188c0 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c  Set,pProbe,iCur,
188d0 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65  pOrderBy,nEq,&re
188e0 76 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  v).      ){.    
188f0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
18900 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
18910 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
18920 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  NGE|WHERE_ORDERB
18930 59 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  Y;.        wsFla
18940 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57 48 45  gs |= (rev ? WHE
18950 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30 29 3b  RE_REVERSE : 0);
18960 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18970 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 31 3b        bSort = 1;
18980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18990 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e      /* If curren
189a0 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  tly calculating 
189b0 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  the cost of usin
189c0 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20  g an index (not 
189d0 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69  the IPK.    ** i
189e0 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65  ndex), determine
189f0 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64   if all required
18a00 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79   column data may
18a10 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74   be obtained wit
18a20 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69  hout .    ** usi
18a30 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ng the main tabl
18a40 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69  e (i.e. if the i
18a50 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69  ndex is a coveri
18a60 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  ng.    ** index 
18a70 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e  for this query).
18a80 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74   If it is, set t
18a90 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  he WHERE_IDX_ONL
18aa0 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a  Y flag in.    **
18ab0 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
18ac0 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f  ise, set the bLo
18ad0 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f  okup variable to
18ae0 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69   true.  */.    i
18af0 66 28 20 70 49 64 78 20 26 26 20 77 73 46 6c 61  f( pIdx && wsFla
18b00 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  gs ){.      Bitm
18b10 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
18b20 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74  lUsed;.      int
18b30 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
18b40 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
18b50 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
18b60 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
18b70 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
18b80 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
18b90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20   ){.          m 
18ba0 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31  &= ~(((Bitmask)1
18bb0 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  )<<x);.        }
18bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18bd0 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
18be0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
18bf0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
18c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18c10 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
18c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
18c30 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
18c40 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
18c50 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
18c60 75 74 2e 20 20 46 6f 72 20 61 6e 20 49 4e 20 6f  ut.  For an IN o
18c70 70 65 72 61 74 6f 72 2c 0a 20 20 20 20 2a 2a 20  perator,.    ** 
18c80 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
18c90 73 74 69 6d 61 74 65 20 65 78 63 65 65 64 20 68  stimate exceed h
18ca0 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20  alf the rows in 
18cb0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
18cc0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f  /.    nRow = (do
18cd0 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e  uble)(aiRowEst[n
18ce0 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20  Eq] * nInMul);. 
18cf0 20 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26     if( bInEst &&
18d00 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74   nRow*2>aiRowEst
18d10 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f  [0] ){.      nRo
18d20 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f  w = aiRowEst[0]/
18d30 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20  2;.      nInMul 
18d40 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61  = (int)(nRow / a
18d50 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20  iRowEst[nEq]);. 
18d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73     }..    /* Ass
18d70 75 6d 65 20 63 6f 6e 73 74 61 6e 74 20 63 6f 73  ume constant cos
18d80 74 20 74 6f 20 61 63 63 65 73 73 20 61 20 72 6f  t to access a ro
18d90 77 20 61 6e 64 20 6c 6f 67 61 72 69 74 68 6d 69  w and logarithmi
18da0 63 20 63 6f 73 74 20 74 6f 0a 20 20 20 20 2a 2a  c cost to.    **
18db0 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
18dc0 72 63 68 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  rch.  Hence, the
18dd0 20 69 6e 69 74 69 61 6c 20 63 6f 73 74 20 69 73   initial cost is
18de0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
18df0 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 72 6f 77  utput.    ** row
18e00 73 20 70 6c 75 73 20 6c 6f 67 32 28 74 61 62 6c  s plus log2(tabl
18e10 65 2d 73 69 7a 65 29 20 74 69 6d 65 73 20 74 68  e-size) times th
18e20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 61  e number of bina
18e30 72 79 20 73 65 61 72 63 68 65 73 2e 0a 20 20 20  ry searches..   
18e40 20 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d 20 6e   */.    cost = n
18e50 52 6f 77 20 2b 20 6e 49 6e 4d 75 6c 2a 65 73 74  Row + nInMul*est
18e60 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29  Log(aiRowEst[0])
18e70 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  ;..    /* Adjust
18e80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18e90 6f 77 73 20 61 6e 64 20 74 68 65 20 63 6f 73 74  ows and the cost
18ea0 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65 66   downward to ref
18eb0 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a  lect rows.    **
18ec0 20 74 68 61 74 20 61 72 65 20 65 78 63 6c 75 64   that are exclud
18ed0 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e 73  ed by range cons
18ee0 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  traints..    */.
18ef0 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f 77      nRow = (nRow
18f00 20 2a 20 28 64 6f 75 62 6c 65 29 65 73 74 42 6f   * (double)estBo
18f10 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31  und) / (double)1
18f20 30 30 3b 0a 20 20 20 20 63 6f 73 74 20 3d 20 28  00;.    cost = (
18f30 63 6f 73 74 20 2a 20 28 64 6f 75 62 6c 65 29 65  cost * (double)e
18f40 73 74 42 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62  stBound) / (doub
18f50 6c 65 29 31 30 30 3b 0a 0a 20 20 20 20 2f 2a 20  le)100;..    /* 
18f60 41 64 64 20 69 6e 20 74 68 65 20 65 73 74 69 6d  Add in the estim
18f70 61 74 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72  ated cost of sor
18f80 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 0a  ting the result.
18f90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62      */.    if( b
18fa0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  Sort ){.      co
18fb0 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
18fc0 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  g(cost);.    }..
18fd0 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 69 6e      /* If all in
18fe0 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65  formation can be
18ff0 20 74 61 6b 65 6e 20 64 69 72 65 63 74 6c 79 20   taken directly 
19000 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
19010 77 65 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  we avoid.    ** 
19020 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b  doing table look
19030 75 70 73 2e 20 20 54 68 69 73 20 72 65 64 75 63  ups.  This reduc
19040 65 73 20 74 68 65 20 63 6f 73 74 20 62 79 20 68  es the cost by h
19050 61 6c 66 2e 20 20 28 4e 6f 74 20 72 65 61 6c 6c  alf.  (Not reall
19060 79 20 2d 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  y -.    ** this 
19070 6e 65 65 64 73 20 74 6f 20 62 65 20 66 69 78 65  needs to be fixe
19080 64 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d.).    */.    i
19090 66 28 20 70 49 64 78 20 26 26 20 62 4c 6f 6f 6b  f( pIdx && bLook
190a0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  up==0 ){.      c
190b0 6f 73 74 20 2f 3d 20 28 64 6f 75 62 6c 65 29 32  ost /= (double)2
190c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 2a 2a  ;.    }.    /***
190d0 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
190e0 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e  this index has n
190f0 6f 77 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  ow been computed
19100 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49   ****/..    /* I
19110 66 20 74 68 65 72 65 20 61 72 65 20 61 64 64 69  f there are addi
19120 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
19130 74 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  ts on this table
19140 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20   that cannot.   
19150 20 2a 2a 20 62 65 20 75 73 65 64 20 77 69 74 68   ** be used with
19160 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 64   the current ind
19170 65 78 2c 20 62 75 74 20 77 68 69 63 68 20 6d 69  ex, but which mi
19180 67 68 74 20 6c 6f 77 65 72 20 74 68 65 20 6e 75  ght lower the nu
19190 6d 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 6f  mber.    ** of o
191a0 75 74 70 75 74 20 72 6f 77 73 2c 20 61 64 6a 75  utput rows, adju
191b0 73 74 20 74 68 65 20 6e 52 6f 77 20 76 61 6c 75  st the nRow valu
191c0 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 20  e accordingly.  
191d0 54 68 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 2a  This only .    *
191e0 2a 20 6d 61 74 74 65 72 73 20 69 66 20 74 68 65  * matters if the
191f0 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69   current index i
19200 73 20 74 68 65 20 6c 65 61 73 74 20 63 6f 73 74  s the least cost
19210 6c 79 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ly, so do not bo
19220 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 69 74 68  ther.    ** with
19230 20 74 68 69 73 20 73 74 65 70 20 69 66 20 77 65   this step if we
19240 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
19250 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  is index will no
19260 74 20 62 65 20 63 68 6f 73 65 6e 2e 0a 20 20 20  t be chosen..   
19270 20 2a 2a 20 41 6c 73 6f 2c 20 6e 65 76 65 72 20   ** Also, never 
19280 72 65 64 75 63 65 20 74 68 65 20 6f 75 74 70 75  reduce the outpu
19290 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 65 6c 6f  t row count belo
192a0 77 20 32 20 75 73 69 6e 67 20 74 68 69 73 20 73  w 2 using this s
192b0 74 65 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tep..    **.    
192c0 2a 2a 20 44 6f 20 6e 6f 74 20 72 65 64 75 63 65  ** Do not reduce
192d0 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
192e0 63 6f 75 6e 74 20 69 66 20 70 53 72 63 20 69 73  count if pSrc is
192f0 20 74 68 65 20 6f 6e 6c 79 20 74 61 62 6c 65 20   the only table 
19300 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  that.    ** is n
19310 6f 74 52 65 61 64 79 3b 20 69 66 20 6e 6f 74 52  otReady; if notR
19320 65 61 64 79 20 69 73 20 61 20 70 6f 77 65 72 20  eady is a power 
19330 6f 66 20 74 77 6f 2e 20 20 54 68 69 73 20 77 69  of two.  This wi
19340 6c 6c 20 62 65 20 74 68 65 20 63 61 73 65 0a 20  ll be the case. 
19350 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6d     ** when the m
19360 61 69 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  ain sqlite3Where
19370 42 65 67 69 6e 28 29 20 6c 6f 6f 70 20 69 73 20  Begin() loop is 
19380 73 63 61 6e 6e 69 6e 67 20 66 6f 72 20 61 20 74  scanning for a t
19390 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 2a 2a  able with.    **
193a0 20 61 6e 64 20 22 6f 70 74 69 6d 61 6c 22 20 69   and "optimal" i
193b0 6e 64 65 78 2c 20 61 6e 64 20 6f 6e 20 73 75 63  ndex, and on suc
193c0 68 20 61 20 73 63 61 6e 20 74 68 65 20 6f 75 74  h a scan the out
193d0 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 0a 20 20  put row count.  
193e0 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 69    ** reduction i
193f0 73 20 6e 6f 74 20 76 61 6c 69 64 20 62 65 63 61  s not valid beca
19400 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  use it does not 
19410 75 70 64 61 74 65 20 74 68 65 20 22 70 43 6f 73  update the "pCos
19420 74 2d 3e 75 73 65 64 22 0a 20 20 20 20 2a 2a 20  t->used".    ** 
19430 62 69 74 6d 61 70 2e 20 20 54 68 65 20 6e 6f 74  bitmap.  The not
19440 52 65 61 64 79 20 62 69 74 6d 61 70 20 77 69 6c  Ready bitmap wil
19450 6c 20 61 6c 73 6f 20 62 65 20 61 20 70 6f 77 65  l also be a powe
19460 72 20 6f 66 20 74 77 6f 20 77 68 65 6e 20 77 65  r of two when we
19470 0a 20 20 20 20 2a 2a 20 61 72 65 20 73 63 61 6e  .    ** are scan
19480 6e 69 6e 67 20 66 6f 72 20 74 68 65 20 6c 61 73  ning for the las
19490 74 20 74 61 62 6c 65 20 69 6e 20 61 20 36 34 2d  t table in a 64-
194a0 77 61 79 20 6a 6f 69 6e 2e 20 20 57 65 20 61 72  way join.  We ar
194b0 65 20 77 69 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a  e willing.    **
194c0 20 74 6f 20 62 79 70 61 73 73 20 74 68 69 73 20   to bypass this 
194d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 6e 20  optimization in 
194e0 74 68 61 74 20 63 6f 72 6e 65 72 20 63 61 73 65  that corner case
194f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19500 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
19510 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26  =pCost->rCost &&
19520 20 28 6e 6f 74 52 65 61 64 79 20 26 20 28 6e 6f   (notReady & (no
19530 74 52 65 61 64 79 2d 31 29 29 21 3d 30 20 29 7b  tReady-1))!=0 ){
19540 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
19570 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
19580 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20   nSkipEq = nEq; 
19590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
195a0 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72  ber of == constr
195b0 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f  aints to skip */
195c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
195d0 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20  Range = nBound; 
195e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
195f0 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74   < constraints t
19600 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
19610 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b  Bitmask thisTab;
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19630 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20  Bitmap for pSrc 
19640 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61  */..      thisTa
19650 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  b = getMask(pWC-
19660 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
19670 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
19680 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
19690 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26  >nTerm; nRow>2 &
196a0 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
196b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
196c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
196d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
196e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
196f0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
19700 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
19710 64 79 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  dy)!=thisTab ) c
19720 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
19730 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
19740 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
19750 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
19760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
19770 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
19780 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
19790 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
197a0 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
197b0 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
197c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
197d0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
197e0 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
197f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
19800 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
19810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19820 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
19830 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
19840 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
19850 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
19860 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
19870 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
19880 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
19890 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
198a0 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
198b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
198c0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
198d0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
198e0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
198f0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
19900 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
19910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
19920 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
19930 74 20 6e 42 6f 75 6e 64 20 72 61 6e 67 65 20 63  t nBound range c
19940 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e 63 65  onstraints since
19950 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
19960 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
19970 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65 64 20  ready accounted 
19980 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20 20 20  for these */.   
19990 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70 52 61           nSkipRa
199a0 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  nge--;.         
199b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
199c0 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65 61      /* Assume ea
199d0 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 72 61  ch additional ra
199e0 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  nge constraint r
199f0 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c  educes the resul
19a00 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
19a10 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66   set size by a f
19a20 61 63 74 6f 72 20 6f 66 20 33 20 2a 2f 0a 20 20  actor of 3 */.  
19a30 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f            nRow /
19a40 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
19a50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79            /* Any
19a70 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
19a80 6e 20 6c 6f 77 65 72 73 20 74 68 65 20 6f 75 74  n lowers the out
19a90 70 75 74 20 72 6f 77 20 63 6f 75 6e 74 20 62 79  put row count by
19aa0 20 68 61 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20   half */.       
19ab0 20 20 20 6e 52 6f 77 20 2f 3d 20 32 3b 0a 20 20     nRow /= 2;.  
19ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19ad0 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3c 32        if( nRow<2
19ae0 20 29 20 6e 52 6f 77 20 3d 20 32 3b 0a 20 20 20   ) nRow = 2;.   
19af0 20 7d 0a 0a 0a 20 20 20 20 57 48 45 52 45 54 52   }...    WHERETR
19b00 41 43 45 28 28 0a 20 20 20 20 20 20 22 25 73 28  ACE((.      "%s(
19b10 25 73 29 3a 20 6e 45 71 3d 25 64 20 6e 49 6e 4d  %s): nEq=%d nInM
19b20 75 6c 3d 25 64 20 65 73 74 42 6f 75 6e 64 3d 25  ul=%d estBound=%
19b30 64 20 62 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b  d bSort=%d bLook
19b40 75 70 3d 25 64 20 77 73 46 6c 61 67 73 3d 30 78  up=%d wsFlags=0x
19b50 25 78 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 20  %x\n".      "   
19b60 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 3d 30        notReady=0
19b70 78 25 6c 6c 78 20 6e 52 6f 77 3d 25 2e 32 66 20  x%llx nRow=%.2f 
19b80 63 6f 73 74 3d 25 2e 32 66 20 75 73 65 64 3d 30  cost=%.2f used=0
19b90 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20  x%llx\n",.      
19ba0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
19bb0 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
19bc0 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
19bd0 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
19be0 4d 75 6c 2c 20 65 73 74 42 6f 75 6e 64 2c 20 62  Mul, estBound, b
19bf0 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77  Sort, bLookup, w
19c00 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 6e 6f  sFlags,.      no
19c10 74 52 65 61 64 79 2c 20 6e 52 6f 77 2c 20 63 6f  tReady, nRow, co
19c20 73 74 2c 20 75 73 65 64 0a 20 20 20 20 29 29 3b  st, used.    ));
19c30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19c40 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62 65   index is the be
19c50 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e 20  st we have seen 
19c60 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63  so far, then rec
19c70 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ord this.    ** 
19c80 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f  index and its co
19c90 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74 20  st in the pCost 
19ca0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
19cb0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64 78  /.    if( (!pIdx
19cc0 20 7c 7c 20 77 73 46 6c 61 67 73 29 0a 20 20 20   || wsFlags).   
19cd0 20 20 26 26 20 28 63 6f 73 74 3c 70 43 6f 73 74    && (cost<pCost
19ce0 2d 3e 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74  ->rCost || (cost
19cf0 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26  <=pCost->rCost &
19d00 26 20 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 6e 52  & nRow<pCost->nR
19d10 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ow)).    ){.    
19d20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
19d30 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f   cost;.      pCo
19d40 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b  st->nRow = nRow;
19d50 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
19d60 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20  ed = used;.     
19d70 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
19d80 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73 26  lags = (wsFlags&
19d90 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20 20  wsFlagMask);.   
19da0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
19db0 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
19dc0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
19dd0 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d  dx = pIdx;.    }
19de0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
19df0 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
19e00 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
19e10 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
19e20 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
19e30 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
19e40 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
19e50 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  ex ) break;..   
19e60 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73 20   /* Reset masks 
19e70 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 64  for the next ind
19e80 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a  ex in the loop *
19e90 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  /.    wsFlagMask
19ea0 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
19eb0 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
19ec0 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
19ed0 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
19ee0 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  rmMask;.  }..  /
19ef0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
19f00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19f10 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f   and the SQLITE_
19f20 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61  ReverseOrder fla
19f30 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74  g.  ** is set, t
19f40 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20  hen reverse the 
19f50 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69  order that the i
19f60 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61  ndex will be sca
19f70 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68  nned.  ** in. Th
19f80 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61  is is used for a
19f90 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69  pplication testi
19fa0 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64  ng, to help find
19fb0 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72   cases.  ** wher
19fc0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65  e application be
19fd0 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20  haviour depends 
19fe0 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65  on the (undefine
19ff0 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20  d) order that.  
1a000 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74  ** SQLite output
1a010 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65  s rows in in the
1a020 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f   absence of an O
1a030 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1a040 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64 65   */.  if( !pOrde
1a050 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64  rBy && pParse->d
1a060 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1a070 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29  E_ReverseOrder )
1a080 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61  {.    pCost->pla
1a090 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
1a0a0 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a  RE_REVERSE;.  }.
1a0b0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1a0c0 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70  rBy || (pCost->p
1a0d0 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
1a0e0 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29 3b  E_ORDERBY)==0 );
1a0f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 73 74  .  assert( pCost
1a100 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30  ->plan.u.pIdx==0
1a110 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e   || (pCost->plan
1a120 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52  .wsFlags&WHERE_R
1a130 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20  OWID_EQ)==0 );. 
1a140 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70   assert( pSrc->p
1a150 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20  Index==0 .      
1a160 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e   || pCost->plan.
1a170 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20  u.pIdx==0 .     
1a180 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e    || pCost->plan
1a190 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70  .u.pIdx==pSrc->p
1a1a0 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57  Index .  );..  W
1a1b0 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74  HERETRACE(("best
1a1c0 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22   index is: %s\n"
1a1d0 2c 20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d 3e  , .    ((pCost->
1a1e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1a1f0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
1a200 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20 3a  N)==0 ? "none" :
1a210 20 0a 20 20 20 20 20 20 20 20 20 70 43 6f 73 74   .         pCost
1a220 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20  ->plan.u.pIdx ? 
1a230 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
1a240 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b  dx->zName : "ipk
1a250 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65  ").  ));.  .  be
1a260 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
1a270 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1a280 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72  c, notReady, pOr
1a290 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20  derBy, pCost);. 
1a2a0 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e   bestAutomaticIn
1a2b0 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1a2c0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1a2d0 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74   pCost);.  pCost
1a2e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
1a2f0 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a  = eqTermMask;.}.
1a300 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
1a310 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61  query plan for a
1a320 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65 20 70  ccessing table p
1a330 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69 74 65  Src->pTab. Write
1a340 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65   the.** best que
1a350 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20  ry plan and its 
1a360 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68  cost into the Wh
1a370 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73  ereCost object s
1a380 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74  upplied .** as t
1a390 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  he last paramete
1a3a0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1a3b0 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65 20 74   may calculate t
1a3c0 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f  he cost of.** bo
1a3d0 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69 72 74  th real and virt
1a3e0 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ual table scans.
1a3f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a400 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
1a410 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a430 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1a440 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1a450 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
1a460 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1a470 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1a480 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1a490 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
1a4a0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1a4b0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
1a4c0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
1a4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1a4e0 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
1a4f0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
1a500 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
1a510 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
1a520 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1a530 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1a540 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
1a550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1a560 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
1a570 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e   plan */.){.#ifn
1a580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a590 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1a5a0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  f( IsVirtual(pSr
1a5b0 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  c->pTab) ){.    
1a5c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1a5d0 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62  fo *p = 0;.    b
1a5e0 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
1a5f0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1a600 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72  c, notReady, pOr
1a610 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 20 26 70  derBy, pCost, &p
1a620 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65  );.    if( p->ne
1a630 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
1a640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1a650 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29 3b  free(p->idxStr);
1a660 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a670 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1a680 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65  >db, p);.  }else
1a690 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
1a6a0 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
1a6b0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1a6c0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
1a6d0 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20  erBy, pCost);.  
1a6e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  }.}../*.** Disab
1a6f0 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
1a700 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1a710 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
1a720 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
1a730 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
1a740 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
1a750 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
1a760 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
1a770 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
1a780 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
1a790 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
1a7a0 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
1a7b0 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
1a7c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
1a7d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
1a7e0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1a7f0 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
1a800 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
1a810 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
1a820 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
1a830 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1a840 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
1a850 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
1a860 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
1a870 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
1a880 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
1a890 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
1a8a0 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
1a8b0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
1a8c0 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
1a8d0 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
1a8e0 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
1a8f0 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
1a900 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
1a910 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
1a920 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
1a930 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1a940 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
1a950 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
1a960 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  led..**.** IMPLE
1a970 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
1a980 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f 20 74  24597-58655 No t
1a990 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20 66 6f  ests are done fo
1a9a0 72 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  r terms that are
1a9b0 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73  .** completely s
1a9c0 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69  atisfied by indi
1a9d0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  ces..**.** Disab
1a9e0 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
1a9f0 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
1aa00 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
1aa10 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
1aa20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
1aa30 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
1aa40 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1aa50 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
1aa60 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
1aa70 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
1aa80 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
1aa90 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
1aaa0 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
1aab0 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
1aac0 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
1aad0 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
1aae0 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
1aaf0 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
1ab00 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
1ab10 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1ab20 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
1ab30 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
1ab40 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
1ab50 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
1ab60 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
1ab70 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
1ab80 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
1ab90 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
1aba0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
1abb0 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
1abc0 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
1abd0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1abe0 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
1abf0 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
1ac00 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
1ac10 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1ac20 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20  M_CODED)==0.    
1ac30 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c    && (pLevel->iL
1ac40 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78  eftJoin==0 || Ex
1ac50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
1ac60 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46  erm->pExpr, EP_F
1ac70 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20  romJoin)).  ){. 
1ac80 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
1ac90 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
1aca0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1acb0 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
1acc0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1acd0 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
1ace0 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
1acf0 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
1ad00 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
1ad10 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
1ad20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1ad30 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
1ad40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ad50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
1ad60 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
1ad70 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74  pcode to apply t
1ad80 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
1ad90 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a  ty string zAff.*
1ada0 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73  * to the n regis
1adb0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
1adc0 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73   base. .**.** As
1add0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1ade0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
1adf0 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68  E entries (which
1ae00 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20   are no-ops) at 
1ae10 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
1ae20 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66   and end of zAff
1ae30 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49   are ignored.  I
1ae40 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
1ae50 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c   zAff are.** SQL
1ae60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68  ITE_AFF_NONE, th
1ae70 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20  en no code gets 
1ae80 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
1ae90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1aea0 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  kes its own copy
1aeb0 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74   of zAff so that
1aec0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66   the caller is f
1aed0 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79  ree.** to modify
1aee0 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73   zAff after this
1aef0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1af00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1af10 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
1af20 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
1af30 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20  , int base, int 
1af40 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a  n, char *zAff){.
1af50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1af60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
1af70 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zAff==0 ){.    
1af80 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1af90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1afa0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
1afb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21    }.  assert( v!
1afc0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75  =0 );..  /* Adju
1afd0 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f  st base and n to
1afe0 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54   skip over SQLIT
1aff0 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
1b000 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  es at the beginn
1b010 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64  ing.  ** and end
1b020 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   of the affinity
1b030 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20   string..  */.  
1b040 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41  while( n>0 && zA
1b050 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  ff[0]==SQLITE_AF
1b060 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
1b070 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20  -;.    base++;. 
1b080 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20     zAff++;.  }. 
1b090 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
1b0a0 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45  Aff[n-1]==SQLITE
1b0b0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1b0c0 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   n--;.  }..  /* 
1b0d0 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69  Code the OP_Affi
1b0e0 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74  nity opcode if t
1b0f0 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
1b100 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a   left to do. */.
1b110 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1b120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b130 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
1b140 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
1b150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b160 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66  geP4(v, -1, zAff
1b170 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
1b180 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1b190 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1b1a0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
1b1b0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1b1c0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
1b1d0 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
1b1e0 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
1b1f0 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
1b200 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
1b210 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
1b220 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
1b230 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
1b240 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
1b250 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
1b260 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
1b270 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1b280 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
1b290 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ter iReg..**.** 
1b2a0 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
1b2b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
1b2c0 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
1b2d0 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
1b2e0 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
1b2f0 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
1b300 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
1b310 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
1b320 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
1b330 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b340 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
1b350 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
1b360 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
1b370 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
1b380 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69  c int codeEquali
1b390 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
1b3a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
1b3b0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1b3c0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
1b3d0 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
1b3e0 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
1b3f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
1b400 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
1b410 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1b420 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c  l, /* When level
1b430 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b440 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69  use we are worki
1b450 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng on */.  int i
1b460 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f  Target         /
1b470 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65 61  * Attempt to lea
1b480 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  ve results in th
1b490 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1b4a0 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70  {.  Expr *pX = p
1b4b0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56  Term->pExpr;.  V
1b4c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b4d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 52  >pVdbe;.  int iR
1b4e0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1b4f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1b500 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 73   holding results
1b510 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
1b520 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  Target>0 );.  if
1b530 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  ( pX->op==TK_EQ 
1b540 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  ){.    iReg = sq
1b550 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1b560 67 65 74 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  get(pParse, pX->
1b570 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1b580 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58  ;.  }else if( pX
1b590 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op==TK_ISNULL 
1b5a0 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  ){.    iReg = iT
1b5b0 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c 69 74  arget;.    sqlit
1b5c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b5d0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67  OP_Null, 0, iReg
1b5e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1b5f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1b600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1b610 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20   eType;.    int 
1b620 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74  iTab;.    struct
1b630 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20   InLoop *pIn;.. 
1b640 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
1b650 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
1b660 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
1b670 20 20 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69      eType = sqli
1b680 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
1b690 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b 0a 20  Parse, pX, 0);. 
1b6a0 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54     iTab = pX->iT
1b6b0 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
1b6c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b6d0 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
1b6e0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1b6f0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1b700 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
1b710 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66 28 20  ABLE );.    if( 
1b720 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1b730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
1b740 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
1b750 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b760 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
1b770 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
1b780 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c  In++;.    pLevel
1b790 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d  ->u.in.aInLoop =
1b7a0 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  .       sqlite3D
1b7b0 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
1b7c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65  Parse->db, pLeve
1b7d0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c  l->u.in.aInLoop,
1b7e0 0a 20 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 73                 s
1b800 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e  izeof(pLevel->u.
1b810 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70  in.aInLoop[0])*p
1b820 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29  Level->u.in.nIn)
1b830 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76  ;.    pIn = pLev
1b840 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1b850 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b  ;.    if( pIn ){
1b860 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c  .      pIn += pL
1b870 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d  evel->u.in.nIn -
1b880 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
1b890 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
1b8a0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
1b8b0 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
1b8c0 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72         pIn->addr
1b8d0 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  InTop = sqlite3V
1b8e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b8f0 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65  Rowid, iTab, iRe
1b900 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
1b910 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
1b920 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
1b930 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b940 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
1b950 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  0, iReg);.      
1b960 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1b970 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1b980 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 0a 20  IsNull, iReg);. 
1b990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b9a0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
1b9b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
1b9c0 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65  if.  }.  disable
1b9d0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
1b9e0 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  rm);.  return iR
1b9f0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
1ba00 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1ba10 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c  will evaluate al
1ba20 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  l == and IN cons
1ba30 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a  traints for an.*
1ba40 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46  * index..**.** F
1ba50 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
1ba60 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
1ba70 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
1ba80 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
1ba90 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
1baa0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
1bab0 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
1bac0 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
1bad0 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
1bae0 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
1baf0 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
1bb00 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1bb10 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
1bb20 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
1bb30 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
1bb40 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
1bb50 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
1bb60 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
1bb70 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
1bb80 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
1bb90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1bba0 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
1bbb0 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
1bbc0 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
1bbd0 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
1bbe0 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
1bbf0 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
1bc00 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
1bc10 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
1bc20 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
1bc30 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
1bc40 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
1bc50 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
1bc60 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
1bc70 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
1bc80 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
1bc90 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
1bca0 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
1bcb0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
1bcc0 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
1bcd0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1bce0 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
1bcf0 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
1bd00 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
1bd10 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20   and.** compute 
1bd20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
1bd30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
1bd40 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
1bd50 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
1bd60 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
1bd70 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  l and returns.**
1bd80 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1bd90 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  at memory cell. 
1bda0 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
1bdb0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1bdc0 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
1bdd0 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  t memory cell to
1bde0 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
1bdf0 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
1be00 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
1be10 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
1be20 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
1be30 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
1be40 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
1be50 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
1be60 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
1be70 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
1be80 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
1be90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
1bea0 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
1beb0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
1bec0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
1bed0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
1bee0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
1bef0 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
1bf00 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
1bf10 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
1bf20 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
1bf30 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
1bf40 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
1bf50 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
1bf60 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
1bf70 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1bf80 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
1bf90 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
1bfa0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1bfb0 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
1bfc0 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
1bfd0 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
1bfe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
1bff0 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
1c000 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
1c010 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
1c020 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
1c030 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
1c040 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
1c050 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
1c060 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
1c070 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
1c080 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
1c090 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
1c0a0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1c0b0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1c0c0 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
1c0d0 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
1c0e0 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
1c0f0 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
1c100 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
1c110 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
1c120 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
1c130 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
1c140 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
1c150 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
1c160 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
1c170 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
1c180 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
1c190 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
1c1a0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
1c1b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1c1c0 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
1c1d0 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
1c1e0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1c1f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c200 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1c210 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
1c220 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
1c230 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
1c240 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
1c250 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1c260 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1c270 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
1c280 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
1c290 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
1c2a0 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
1c2b0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
1c2c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1c2d0 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
1c2e0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1c2f0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1c300 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1c310 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
1c320 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
1c330 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
1c340 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
1c350 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
1c360 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f  l->plan.nEq;   /
1c370 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1c380 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
1c390 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
1c3a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c3b0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1c3c0 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1c3d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1c3e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1c410 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1c420 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
1c430 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
1c440 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20  abCur;   /* The 
1c450 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
1c460 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ble */.  WhereTe
1c470 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
1c480 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
1c490 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
1c4a0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  rm */.  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 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1c4d0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
1c4e0 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
1c4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
1c500 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1c510 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c530 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
1c540 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
1c550 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c570 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
1c580 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
1c590 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
1c5a0 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
1c5b0 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
1c5c0 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
1c5d0 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ndex. */.  asser
1c5e0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  t( pLevel->plan.
1c5f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1c600 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64  INDEXED );.  pId
1c610 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1c620 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46  .u.pIdx;..  /* F
1c630 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1c640 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
1c650 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
1c660 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
1c670 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
1c680 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1c690 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65   1;.  nReg = pLe
1c6a0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20  vel->plan.nEq + 
1c6b0 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
1c6c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1c6d0 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
1c6e0 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
1c6f0 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
1c700 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
1c710 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
1c720 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
1c730 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c740 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
1c750 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
1c760 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1c770 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
1c780 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
1c790 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
1c7a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
1c7b0 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
1c7c0 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
1c7d0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
1c7e0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
1c7f0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1c800 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
1c810 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1c820 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  gs, pIdx);.    i
1c830 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d  f( NEVER(pTerm==
1c840 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
1c850 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c860 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65   true for indice
1c870 73 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74  s with redundant
1c880 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a   columns. .    *
1c890 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44  * Ex: CREATE IND
1c8a0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c  EX i1 ON t1(a,b,
1c8b0 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  a); SELECT * FRO
1c8c0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41  M t1 WHERE a=0 A
1c8d0 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74  ND b=0; */.    t
1c8e0 65 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d  estcase( (pTerm-
1c8f0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1c900 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20  CODED)!=0 );.   
1c910 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1c920 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1c930 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
1c940 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
1c950 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   */.    r1 = cod
1c960 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
1c970 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
1c980 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  vel, regBase+j);
1c990 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
1c9a0 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
1c9b0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
1c9c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1c9d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c9e0 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
1c9f0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
1ca00 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
1ca10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ca20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ca30 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
1ca40 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
1ca50 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1ca60 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1ca70 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1ca80 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
1ca90 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1caa0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1cab0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1cac0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
1cad0 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
1cae0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1caf0 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
1cb00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1cb10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cb20 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
1cb30 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
1cb40 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
1cb50 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
1cb60 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20   zAff ){.       
1cb70 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1cb80 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1cb90 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51  ht, zAff[j])==SQ
1cba0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
1cbb0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1cbc0 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1cbd0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1cbe0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1cbf0 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
1cc00 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
1cc10 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b  ght, zAff[j]) ){
1cc20 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1cc30 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  j] = SQLITE_AFF_
1cc40 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
1cc50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cc60 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66  }.  *pzAff = zAf
1cc70 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42  f;.  return regB
1cc80 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ase;.}../*.** Ge
1cc90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1cca0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1ccb0 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20   iLevel-th loop 
1ccc0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1ccd0 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  use.** implement
1cce0 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
1ccf0 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74  by pWInfo..*/.st
1cd00 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64  atic Bitmask cod
1cd10 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20  eOneLoopStart(. 
1cd20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1cd30 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74  fo,   /* Complet
1cd40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
1cd50 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  out the WHERE cl
1cd60 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
1cd70 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  evel,          /
1cd80 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66  * Which level of
1cd90 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f   pWInfo->a[] sho
1cda0 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a  uld be coded */.
1cdb0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1cdc0 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ,      /* One of
1cdd0 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
1cde0 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
1cdf0 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42  liteInt.h */.  B
1ce00 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
1ce10 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62      /* Which tab
1ce20 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  les are currentl
1ce30 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29  y available */.)
1ce40 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20  {.  int j, k;   
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1ce60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
1ce70 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1ce80 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
1ce90 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74  cursor for the t
1cea0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  able */.  int ad
1ceb0 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f  drNxt;         /
1cec0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
1ced0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1cee0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
1cef0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54  e */.  int omitT
1cf00 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  able;       /* T
1cf10 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
1cf20 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
1cf30 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20    int bRev;     
1cf40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cf50 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61  f we need to sca
1cf60 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1cf70 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  er */.  WhereLev
1cf80 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20  el *pLevel;  /* 
1cf90 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20  The where level 
1cfa0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1cfb0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1cfc0 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
1cfd0 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
1cfe0 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
1cff0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1d000 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1d010 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
1d020 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
1d030 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d050 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1d060 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20  ntext */.  Vdbe 
1d070 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1d080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d090 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
1d0a0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1d0b0 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
1d0c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
1d0d0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
1d0e0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
1d0f0 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
1d100 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d120 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
1d130 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
1d140 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
1d150 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
1d160 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d170 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
1d180 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
1d190 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
1d1a0 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
1d1b0 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
1d1c0 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
1d1d0 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
1d1e0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
1d1f0 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
1d200 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
1d210 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
1d220 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20   returning */.. 
1d230 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
1d240 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20  ->pParse;.  v = 
1d250 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d260 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   pWC = pWInfo->p
1d270 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  WC;.  pLevel = &
1d280 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1d290 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  ];.  pTabItem = 
1d2a0 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  &pWInfo->pTabLis
1d2b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1d2c0 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54  om];.  iCur = pT
1d2d0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
1d2e0 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65  .  bRev = (pLeve
1d2f0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1d300 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
1d310 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65  !=0;.  omitTable
1d320 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
1d330 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1d340 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
1d350 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63            && (wc
1d360 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1d370 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
1d380 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c  ;..  /* Create l
1d390 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62  abels for the "b
1d3a0 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69  reak" and "conti
1d3b0 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  nue" instruction
1d3c0 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63  s.  ** for the c
1d3d0 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75  urrent loop.  Ju
1d3e0 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f  mp to addrBrk to
1d3f0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
1d400 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20  loop..  ** Jump 
1d410 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d  to cont to go im
1d420 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65  mediately to the
1d430 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
1d440 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70  of the.  ** loop
1d450 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
1d460 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20   there is an IN 
1d470 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73  operator, we als
1d480 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78  o have a "addrNx
1d490 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20  t" label that.  
1d4a0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
1d4b0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1d4c0 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
1d4d0 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
1d4e0 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f   ** there are no
1d4f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e   IN operators in
1d500 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1d510 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20  , the "addrNxt" 
1d520 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68  label.  ** is th
1d530 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42  e same as "addrB
1d540 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  rk"..  */.  addr
1d550 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1d560 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1d570 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65  addrNxt = sqlite
1d580 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1d590 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  );.  addrCont = 
1d5a0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
1d5b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1d5c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
1d5d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1d5e0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1d5f0 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
1d600 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
1d610 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1d620 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  a memory cell th
1d630 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68  at records if th
1d640 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73  is table matches
1d650 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   any.  ** row of
1d660 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
1d670 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
1d680 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  /.  if( pLevel->
1d690 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62  iFrom>0 && (pTab
1d6a0 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  Item[0].jointype
1d6b0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
1d6c0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c  {.    pLevel->iL
1d6d0 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
1d6e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1d6f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d700 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1d710 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
1d720 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  oin);.    VdbeCo
1d730 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20  mment((v, "init 
1d740 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
1d750 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a  ch flag"));.  }.
1d760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d770 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1d780 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c  E.  if(  (pLevel
1d790 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d7a0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1d7b0 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  BLE)!=0 ){.    /
1d7c0 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74  * Case 0:  The t
1d7d0 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
1d7e0 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
1d7f0 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
1d800 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ext.    **      
1d810 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68      to access th
1d820 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  e data..    */. 
1d830 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f     int iReg;   /
1d840 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f  * P3 Value for O
1d850 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20  P_VFilter */.   
1d860 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1d870 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20  nfo *pVtabIdx = 
1d880 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1d890 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69 6e 74  VtabIdx;.    int
1d8a0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1d8b0 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72  VtabIdx->nConstr
1d8c0 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75 63 74  aint;.    struct
1d8d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
1d8e0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
1d8f0 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  *aUsage =.      
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49            pVtabI
1d930 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  dx->aConstraintU
1d940 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  sage;.    const 
1d950 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1d960 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
1d970 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20  *aConstraint =. 
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d9b0 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72  VtabIdx->aConstr
1d9c0 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74  aint;..    sqlit
1d9d0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1d9e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1d9f0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1da00 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1da10 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1da20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
1da30 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
1da40 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  ){.      for(k=0
1da50 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; k<nConstraint;
1da60 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
1da70 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67  f( aUsage[k].arg
1da80 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20  vIndex==j ){.   
1da90 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d         int iTerm
1daa0 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b   = aConstraint[k
1dab0 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ].iTermOffset;. 
1dac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1dad0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1dae0 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70   pWC->a[iTerm].p
1daf0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52  Expr->pRight, iR
1db00 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20  eg+j+1);.       
1db10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1db20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1db30 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72    if( k==nConstr
1db40 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
1db50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1db60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db70 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62 49 64  Integer, pVtabId
1db80 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  x->idxNum, iReg)
1db90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1dba0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1dbb0 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67  teger, j-1, iReg
1dbc0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
1dbd0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1dbe0 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20  _VFilter, iCur, 
1dbf0 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c 20 70  addrBrk, iReg, p
1dc00 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74 72 2c  VtabIdx->idxStr,
1dc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
1dc30 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1dc40 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  r ? P4_MPRINTF :
1dc50 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1dc60 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
1dc70 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
1dc80 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1dc90 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
1dca0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 55 73  ){.      if( aUs
1dcb0 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20  age[j].omit ){. 
1dcc0 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d         int iTerm
1dcd0 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a   = aConstraint[j
1dce0 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ].iTermOffset;. 
1dcf0 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
1dd00 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d  rm(pLevel, &pWC-
1dd10 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20  >a[iTerm]);.    
1dd20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
1dd30 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
1dd40 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
1dd50 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
1dd60 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
1dd70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1dd80 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
1dd90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1dda0 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  nge(pParse, iReg
1ddb0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1ddc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1ddd0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1dde0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
1ddf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1de00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1de10 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65   */..  if( pLeve
1de20 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1de30 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
1de40 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1de50 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63  1:  We can direc
1de60 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20  tly reference a 
1de70 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67  single row using
1de80 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   an.    **      
1de90 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
1dea0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1deb0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1dec0 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20    Or.    **     
1ded0 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
1dee0 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
1def0 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
1df00 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  N (...)".    ** 
1df10 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
1df20 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ct..    */.    i
1df30 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1df40 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1df50 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72  Parse);.    pTer
1df60 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1df70 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
1df80 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
1df90 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  N, 0);.    asser
1dfa0 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1dfb0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1dfc0 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
1dfd0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
1dfe0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1dff0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1e000 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1e010 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1e020 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1e030 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
1e040 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
1e050 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77  1662 */.    iRow
1e060 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61  idReg = codeEqua
1e070 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
1e080 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
1e090 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20  iReleaseReg);.  
1e0a0 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76    addrNxt = pLev
1e0b0 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20  el->addrNxt;.   
1e0c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e0d0 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
1e0e0 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61  nt, iRowidReg, a
1e0f0 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c  ddrNxt);.    sql
1e100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1e110 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
1e120 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69  iCur, addrNxt, i
1e130 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73  RowidReg);.    s
1e140 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
1e150 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
1e160 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
1e170 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1e180 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1e190 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1e1a0 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  OP_Noop;.  }else
1e1b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1e1c0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1e1d0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
1e1e0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20  .    /* Case 2: 
1e1f0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
1e200 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
1e210 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
1e220 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a  WID field..    *
1e230 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70  /.    int testOp
1e240 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1e250 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69  int start;.    i
1e260 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d  nt memEndValue =
1e270 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72   0;.    WhereTer
1e280 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
1e290 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ;..    assert( o
1e2a0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1e2b0 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64     pStart = find
1e2c0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
1e2d0 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
1e2e0 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
1e2f0 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
1e300 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
1e310 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
1e320 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
1e330 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
1e340 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
1e350 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  t;.      pStart 
1e360 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45  = pEnd;.      pE
1e370 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
1e380 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  }.    if( pStart
1e390 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1e3a0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1e3b0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1e3c0 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  n that defines t
1e3d0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a  he start bound *
1e3e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  /.      int r1, 
1e3f0 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a  rTemp;        /*
1e400 20 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68   Registers for h
1e410 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74  olding the start
1e420 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20   boundary */..  
1e430 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1e440 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61  wing constant ma
1e450 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69  ps TK_xx codes i
1e460 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  nto correspondin
1e470 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b  g .      ** seek
1e480 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65   opcodes.  It de
1e490 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69  pends on a parti
1e4a0 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f  cular ordering o
1e4b0 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f  f TK_xx.      */
1e4c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1e4d0 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aMoveOp[] = {.  
1e4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1e4f0 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c  T */  OP_SeekGt,
1e500 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1e510 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LE */  OP_Seek
1e520 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Le,.           /
1e530 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53  * TK_LT */  OP_S
1e540 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  eekLt,.         
1e550 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f    /* TK_GE */  O
1e560 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d  P_SeekGe.      }
1e570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e580 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29  TK_LE==TK_GT+1 )
1e590 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;      /* Make s
1e5a0 75 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67  ure the ordering
1e5b0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .. */.      asse
1e5c0 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
1e5d0 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e  +2 );      /*  .
1e5e0 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20  .. of the TK_xx 
1e5f0 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20  values... */.   
1e600 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
1e610 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20  ==TK_GT+3 );    
1e620 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72    /*  ... is cor
1e630 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20  recct. */..     
1e640 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61 72   testcase( pStar
1e650 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
1e660 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20  M_VIRTUAL ); /* 
1e670 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36  EV: R-30575-1166
1e680 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20  2 */.      pX = 
1e690 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1e6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1e6b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1e6c0 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
1e6d0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1e6e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e6f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e700 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
1e710 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20  t, &rTemp);.    
1e720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e730 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70  Op3(v, aMoveOp[p
1e740 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43  X->op-TK_GT], iC
1e750 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29  ur, addrBrk, r1)
1e760 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
1e770 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1e780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e790 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1e7a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
1e7b0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1e7c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e7d0 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b  (pParse, rTemp);
1e7e0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1e7f0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
1e800 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1e810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e820 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
1e830 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
1e840 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72  wind, iCur, addr
1e850 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Brk);.    }.    
1e860 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
1e870 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
1e880 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78    pX = pEnd->pEx
1e890 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1e8a0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1e8b0 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
1e8c0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1e8d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e8e0 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73  e( pEnd->wtFlags
1e8f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e900 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1e910 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
1e920 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b   memEndValue = +
1e930 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1e940 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e950 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
1e960 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56  >pRight, memEndV
1e970 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
1e980 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c   pX->op==TK_LT |
1e990 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  | pX->op==TK_GT 
1e9a0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  ){.        testO
1e9b0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
1e9c0 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
1e9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1e9e0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1e9f0 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
1ea00 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61      }.      disa
1ea10 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1ea20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pEnd);.    }.   
1ea30 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
1ea40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1ea50 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v);.    pLevel->
1ea60 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1ea70 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1ea80 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1ea90 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1eaa0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
1eab0 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20    if( pStart==0 
1eac0 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20  && pEnd==0 ){.  
1ead0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
1eae0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
1eaf0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
1eb00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eb10 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65     assert( pLeve
1eb20 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20  l->p5==0 );.    
1eb30 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70  }.    if( testOp
1eb40 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
1eb50 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69     iRowidReg = i
1eb60 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c  ReleaseReg = sql
1eb70 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1eb80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1eb90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1eba0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
1ebb0 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  r, iRowidReg);. 
1ebc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ebd0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1ebe0 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1ebf0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
1ec00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ec10 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45  (v, testOp, memE
1ec20 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b  ndValue, addrBrk
1ec30 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1ec40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ec50 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
1ec60 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
1ec70 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1ec80 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  L);.    }.  }els
1ec90 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
1eca0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
1ecb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1ecc0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1ecd0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  ) ){.    /* Case
1ece0 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   3: A scan using
1ecf0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1ed00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1ed10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1ed20 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1ed30 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1ed40 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1ed50 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1ed60 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1ed70 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1ed80 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1ed90 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1eda0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1edb0 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1edc0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1edd0 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1ede0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1edf0 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1ee00 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1ee10 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1ee20 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1ee30 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1ee40 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1ee50 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1ee60 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1ee70 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1ee80 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1ee90 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1eea0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1eeb0 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1eec0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1eed0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1eee0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1eef0 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1ef00 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1ef10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1ef20 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1ef30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1ef40 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1ef50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ef60 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1ef70 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1ef80 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1ef90 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1efa0 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1efb0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1efc0 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1efe0 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1eff0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1f000 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1f010 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1f020 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1f030 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1f040 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1f050 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1f060 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f070 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1f080 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f090 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1f0a0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1f0b0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f0c0 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1f0d0 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1f0e0 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1f0f0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1f100 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1f110 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1f120 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1f130 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1f140 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1f150 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1f160 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1f170 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1f180 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1f190 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1f1a0 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1f1b0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1f1c0 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1f1d0 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1f1e0 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1f1f0 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1f200 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1f210 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1f220 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1f230 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1f240 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1f250 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1f260 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1f270 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1f280 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f290 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1f2a0 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1f2b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1f2c0 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1f2d0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f2e0 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1f2f0 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1f300 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1f310 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1f320 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1f330 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1f340 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1f350 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1f360 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1f370 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1f380 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1f390 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1f3a0 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1f3b0 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1f3c0 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1f3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1f3e0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f3f0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1f400 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1f410 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1f420 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1f430 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1f440 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1f450 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1f460 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1f470 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1f480 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1f490 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1f4a0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1f4b0 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1f4c0 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1f4d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1f4e0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1f4f0 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
1f500 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20  evel->plan.nEq; 
1f510 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
1f520 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a   or IN terms */.
1f530 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
1f540 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
1f550 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1f560 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45  n optimized SELE
1f570 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20  CT min(x).. */. 
1f580 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20     int regBase; 
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1f5b0 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61   holding constra
1f5c0 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  int values */.  
1f5d0 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20    int r1;       
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f5f0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
1f600 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1f610 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20   *pRangeStart = 
1f620 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74  0;  /* Inequalit
1f630 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1f640 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20  range start */. 
1f650 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
1f660 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20  angeEnd = 0;    
1f670 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
1f680 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
1f690 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  e end */.    int
1f6a0 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20   startEq;       
1f6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f6c0 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74  e if range start
1f6d0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
1f6e0 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e  <= */.    int en
1f6f0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
1f700 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f710 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
1f720 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
1f730 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63  .    int start_c
1f740 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20  onstraints;     
1f750 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61    /* Start of ra
1f760 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
1f770 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  ed */.    int nC
1f780 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1f790 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f7a0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
1f7b0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  erms */.    Inde
1f7c0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1f7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f7e0 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
1f7f0 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
1f800 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
1f810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f820 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
1f830 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
1f840 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67     int nExtraReg
1f850 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f860 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1f870 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65  ra registers nee
1f880 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ded */.    int o
1f890 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f8a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72          /* Instr
1f8b0 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  uction opcode */
1f8c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72  .    char *zStar
1f8d0 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tAff;           
1f8e0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1f8f0 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65  r start of range
1f900 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1f910 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66     char *zEndAff
1f920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f930 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
1f940 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  end of range con
1f950 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20  straint */..    
1f960 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
1f970 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
1f980 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
1f990 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b  ->iIdxCur;.    k
1f9a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1f9b0 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43  n[nEq];     /* C
1f9c0 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61  olumn for inequa
1f9d0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1f9e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
1f9f0 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
1fa00 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
1fa10 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
1fa20 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20  st that .    ** 
1fa30 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1fa40 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
1fa50 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
1fa60 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
1fa70 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68      ** query, th
1fa80 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  en the caller wi
1fa90 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68  ll only allow th
1faa0 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f  e loop to run fo
1fab0 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c  r.    ** a singl
1fac0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
1fad0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1fae0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
1faf0 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  ned.    ** shoul
1fb00 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c  d not have a NUL
1fb10 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  L value stored i
1fb20 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e  n 'x'. If column
1fb30 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74   'x' is.    ** t
1fb40 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74  he first one aft
1fb50 65 72 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  er the nEq equal
1fb60 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1fb70 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20  in the index,.  
1fb80 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72    ** this requir
1fb90 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20  es some special 
1fba0 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f  handling..    */
1fbb0 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46  .    if( (wctrlF
1fbc0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
1fbd0 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20  BY_MIN)!=0.     
1fbe0 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  && (pLevel->plan
1fbf0 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f  .wsFlags&WHERE_O
1fc00 52 44 45 52 42 59 29 0a 20 20 20 20 20 26 26 20  RDERBY).     && 
1fc10 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e  (pIdx->nColumn>n
1fc20 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Eq).    ){.     
1fc30 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
1fc40 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
1fc50 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73  ; */.      /* as
1fc60 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
1fc70 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
1fc80 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
1fc90 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20  umn[nEq] ); */. 
1fca0 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20       isMinQuery 
1fcb0 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  = 1;.      nExtr
1fcc0 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  aReg = 1;.    }.
1fcd0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79  .    /* Find any
1fce0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1fcf0 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72  traint terms for
1fd00 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
1fd10 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nd .    ** of th
1fd20 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f  e range. .    */
1fd30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1fd40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1fd50 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1fd60 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
1fd70 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  nd = findTerm(pW
1fd80 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
1fd90 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eady, (WO_LT|WO_
1fda0 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  LE), pIdx);.    
1fdb0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
1fdc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fdd0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1fde0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1fdf0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1fe00 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e  RangeStart = fin
1fe10 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
1fe20 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
1fe30 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64  O_GT|WO_GE), pId
1fe40 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
1fe50 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
1fe60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1fe70 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
1fe80 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
1fe90 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
1fea0 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20  r IN.    ** and 
1feb0 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73  store the values
1fec0 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
1fed0 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
1fee0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1fef0 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42  starting at regB
1ff00 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1ff10 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
1ff20 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1ff30 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1ff40 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74  pLevel, pWC, not
1ff50 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67  Ready, nExtraReg
1ff60 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20  , &zStartAff.   
1ff70 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20   );.    zEndAff 
1ff80 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1ff90 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  p(pParse->db, zS
1ffa0 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64  tartAff);.    ad
1ffb0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
1ffc0 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a  addrNxt;..    /*
1ffd0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1ffe0 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65 72   a reverse order
1fff0 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65   scan on an asce
20000 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a  nding index, or.
20010 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
20020 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
20030 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
20040 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
20050 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  he .    ** start
20060 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28   and end terms (
20070 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20  pRangeStart and 
20080 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20  pRangeEnd)..    
20090 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70  */.    if( nEq<p
200a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
200b0 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
200c0 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
200d0 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a  LITE_SO_ASC) ){.
200e0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
200f0 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
20100 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
20110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
20120 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20130 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
20140 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20150 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
20160 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
20170 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
20180 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
20190 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
201a0 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
201b0 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
201c0 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
201d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
201e0 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
201f0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20200 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
20210 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
20220 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
20230 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
20240 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
20250 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
20260 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
20270 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
20280 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
20290 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
202a0 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
202b0 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
202c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
202d0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
202e0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
202f0 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
20300 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
20310 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
20320 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
20330 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
20340 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
20350 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
20360 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20370 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
20380 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
20390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
203a0 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
203b0 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
203c0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
203d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74  );.      if( zSt
203e0 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
203f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
20400 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
20410 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
20420 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
20430 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
20440 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
20450 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
20460 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
20470 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
20480 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
20490 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
204a0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
204b0 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
204c0 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
204d0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
204e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
204f0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
20500 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20510 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20530 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
20540 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
20550 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
20560 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
20570 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
20580 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
20590 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
205a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
205b0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
205c0 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
205d0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
205e0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
205f0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
20600 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
20610 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
20620 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
20630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
20650 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
20660 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
20670 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
20680 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
20690 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
206a0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
206b0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
206c0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
206d0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
206e0 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
206f0 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
20700 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
20710 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
20720 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
20730 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
20740 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
20750 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
20760 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20770 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
20780 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
20790 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
207a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
207b0 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
207c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
207d0 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
207e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
207f0 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
20800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20810 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
20820 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
20830 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
20840 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
20850 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
20860 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
20870 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
20880 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
20890 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
208a0 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
208b0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
208c0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
208d0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
208e0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
208f0 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
20900 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
20910 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
20920 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
20930 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
20940 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20950 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
20960 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
20970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20980 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
20990 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
209a0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
209b0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 6e 64  ;.      if( zEnd
209c0 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
209d0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
209e0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
209f0 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d  , zEndAff[nEq])=
20a00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
20a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
20a20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
20a30 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
20a40 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
20a50 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
20a60 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
20a70 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
20a80 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
20a90 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
20aa0 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
20ab0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
20ac0 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
20ad0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
20ae0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20af0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20b00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20b10 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
20b20 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
20b30 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71  ght, zEndAff[nEq
20b40 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
20b50 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
20b60 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
20b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20b80 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70  }  .      codeAp
20b90 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
20ba0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
20bb0 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20  +1, zEndAff);.  
20bc0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20bd0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
20be0 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
20bf0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
20c00 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
20c10 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
20c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20c30 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20c40 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
20c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20c60 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 45  e(pParse->db, zE
20c70 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  ndAff);..    /* 
20c80 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
20c90 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
20ca0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
20cb0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
20cc0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
20cd0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
20ce0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
20cf0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
20d00 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20  ge. */.    op = 
20d10 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e  aEndOp[(pRangeEn
20d20 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b  d || nEq) * (1 +
20d30 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73   bRev)];.    tes
20d40 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
20d50 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  op );.    testca
20d60 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45  se( op==OP_IdxGE
20d70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20d80 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
20d90 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50  ;.    if( op!=OP
20da0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
20db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20dc0 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
20dd0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
20de0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
20df0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20e00 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20e10 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
20e20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
20e30 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
20e40 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
20e50 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
20e60 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
20e70 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
20e80 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
20e90 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
20ea0 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
20eb0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
20ec0 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
20ed0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
20ee0 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
20ef0 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
20f00 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
20f10 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
20f20 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
20f30 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20f40 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
20f50 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
20f60 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
20f70 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
20f80 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  IT );.    if( pL
20f90 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
20fa0 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
20fb0 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
20fc0 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20  LIMIT) ){.      
20fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20fe0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
20ff0 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
21000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21020 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
21030 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
21040 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21050 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
21060 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
21070 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
21080 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
21090 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
210a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
210b0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
210c0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
210d0 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
210e0 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
210f0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
21100 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
21110 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
21120 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
21130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21140 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
21150 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
21160 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
21170 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
21180 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
21190 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
211a0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
211b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
211c0 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
211d0 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
211e0 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
211f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
21200 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
21210 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
21220 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
21230 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
21240 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
21250 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
21260 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
21270 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
21280 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  */.    pLevel->o
21290 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
212a0 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
212b0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
212c0 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a  IdxCur;.  }else.
212d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
212e0 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
212f0 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65  TION.  if( pLeve
21300 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
21310 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
21320 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
21330 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  4:  Two or more 
21340 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
21350 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
21360 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
21370 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
21380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
21390 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
213a0 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
213b0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
213c0 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
213d0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
213e0 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
213f0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
21400 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
21410 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
21420 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21430 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
21440 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
21450 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
21460 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
21470 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
21480 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
21490 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
214a0 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
214b0 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
214c0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
214d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
214e0 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
214f0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
21500 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
21510 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
21520 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
21530 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
21540 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
21550 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
21560 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
21570 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
21580 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
21590 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
215a0 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
215b0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
215c0 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
215d0 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
215e0 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
215f0 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
21600 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
21610 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
21620 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
21630 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
21640 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
21650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
21660 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
21670 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
21680 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
216a0 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
216b0 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
216c0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
216d0 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
216e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
216f0 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
21700 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
21710 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
21720 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
21730 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
21740 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
21750 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
21760 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
21770 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
21780 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
21790 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
217a0 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
217b0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
217c0 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
217d0 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
217e0 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
217f0 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
21810 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
21820 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
21830 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
21840 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
21850 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
21860 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
21870 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
21880 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
21890 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
218a0 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
218b0 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
218c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
218d0 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
218e0 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
218f0 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
21900 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
21910 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
21920 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
21930 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
21940 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69 6e   WhereTerm *pFin
21950 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  al;     /* Final
21960 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e 20   subterm within 
21970 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 2e 20 2a  the OR-clause. *
21980 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
21990 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
219a0 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
219b0 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
219c0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
219d0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74 75  .    int regRetu
219e0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
219f0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Mem;           /
21a00 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20  * Register used 
21a10 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f  with OP_Gosub */
21a20 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 73  .    int regRows
21a30 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a50 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 52  * Register for R
21a60 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  owSet object */.
21a70 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
21a80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21aa0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
21ab0 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69  g rowid */.    i
21ac0 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73  nt iLoopBody = s
21ad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
21ae0 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61 72  bel(v);  /* Star
21af0 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a  t of loop body *
21b00 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49 6e  /.    int iRetIn
21b10 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 65  /* Address of re
21b40 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a  gReturn init */.
21b50 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65 64      int untested
21b60 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20 20  Terms = 0;      
21b70 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74         /* Some t
21b80 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  erms not complet
21b90 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20 20  ely tested */.  
21ba0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a 20 20    int ii;.   .  
21bb0 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c    pTerm = pLevel
21bc0 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a  ->plan.u.pTerm;.
21bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
21be0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  m!=0 );.    asse
21bf0 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
21c00 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20  ator==WO_OR );. 
21c10 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
21c20 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
21c30 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a  M_ORINFO)!=0 );.
21c40 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54 65      pOrWc = &pTe
21c50 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
21c60 63 3b 0a 20 20 20 20 70 46 69 6e 61 6c 20 3d 20  c;.    pFinal = 
21c70 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 57 63 2d  &pOrWc->a[pOrWc-
21c80 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 20 20 20 20 70  >nTerm-1];.    p
21c90 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
21ca0 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
21cb0 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
21cc0 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  n;..    /* Set u
21cd0 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  p a new SrcList 
21ce0 6e 69 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69  ni pOrTab contai
21cf0 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62  ning the table b
21d00 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20  eing scanned.   
21d10 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70   ** by this loop
21d20 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f   in the a[0] slo
21d30 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61  t and all notRea
21d40 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31  dy tables in a[1
21d50 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  ..] slots..    *
21d60 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74  * This becomes t
21d70 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68  he SrcList in th
21d80 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
21d90 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
21da0 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a  Begin()..    */.
21db0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
21dc0 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20  nLevel>1 ){.    
21dd0 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b    int nNotReady;
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
21e00 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  f notReady table
21e10 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
21e20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21e30 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20  origSrc;     /* 
21e40 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66  Original list of
21e50 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
21e60 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49   nNotReady = pWI
21e70 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c  nfo->nLevel - iL
21e80 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20  evel - 1;.      
21e90 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33  pOrTab = sqlite3
21ea0 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50  StackAllocRaw(pP
21eb0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f        sizeof(*pO
21ee0 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79  rTab)+ nNotReady
21ef0 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e  *sizeof(pOrTab->
21f00 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
21f10 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65  ( pOrTab==0 ) re
21f20 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20  turn notReady;. 
21f30 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c       pOrTab->nAl
21f40 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74  loc = (i16)(nNot
21f50 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20  Ready + 1);.    
21f60 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d    pOrTab->nSrc =
21f70 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b   pOrTab->nAlloc;
21f80 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  .      memcpy(pO
21f90 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65  rTab->a, pTabIte
21fa0 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49  m, sizeof(*pTabI
21fb0 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69  tem));.      ori
21fc0 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  gSrc = pWInfo->p
21fd0 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  TabList->a;.    
21fe0 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e    for(k=1; k<=nN
21ff0 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20  otReady; k++){. 
22000 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
22010 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72  OrTab->a[k], &or
22020 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e  igSrc[pLevel[k].
22030 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70  iFrom], sizeof(p
22040 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20  OrTab->a[k]));. 
22050 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22060 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d  {.      pOrTab =
22070 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
22080 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
22090 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
220a0 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20  rowset register 
220b0 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e  to contain NULL.
220c0 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20   An SQL NULL is 
220d0 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65  .    ** equivale
220e0 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72  nt to an empty r
220f0 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  owset..    **.  
22100 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61    ** Also initia
22110 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74  lize regReturn t
22120 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64  o contain the ad
22130 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73  dress of the ins
22140 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  truction .    **
22150 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
22160 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  lowing the OP_Re
22170 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74  turn at the bott
22180 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  om of the loop. 
22190 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72  This.    ** is r
221a0 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77  equired in a few
221b0 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f   obscure LEFT JO
221c0 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63  IN cases where c
221d0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20  ontrol jumps.   
221e0 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70   ** over the top
221f0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74   of the loop int
22200 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74  o the body of it
22210 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
22220 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  he .    ** corre
22230 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20  ct response for 
22240 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  the end-of-loop 
22250 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74  code (the OP_Ret
22260 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20  urn) is to .    
22270 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** fall through 
22280 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
22290 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73  ruction, just as
222a0 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73   an OP_Next does
222b0 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65   if.    ** calle
222c0 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  d on an uninitia
222d0 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20  lized cursor..  
222e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63    */.    if( (wc
222f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
22300 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
22310 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
22320 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
22330 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
22340 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
22350 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
22360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22370 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
22380 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
22390 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
223a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
223b0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
223c0 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
223d0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
223e0 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b  ii<pOrWc->nTerm;
223f0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68   ii++){.      Wh
22400 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
22410 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d   = &pOrWc->a[ii]
22420 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
22430 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
22440 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d  =iCur || pOrTerm
22450 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
22460 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 57  AND ){.        W
22470 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
22480 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nfo;          /*
22490 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65   Info for single
224a0 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f   OR-term scan */
224b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
224c0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
224d0 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
224e0 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
224f0 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57  */.        pSubW
22500 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
22510 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
22520 20 70 4f 72 54 61 62 2c 20 70 4f 72 54 65 72 6d   pOrTab, pOrTerm
22530 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->pExpr, 0,.    
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
22560 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54  PEN | WHERE_OMIT
22570 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  _CLOSE |.       
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22590 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
225a0 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
225b0 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BLE_ONLY);.     
225c0 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
225d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
225e0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
225f0 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
22600 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
22610 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
22620 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
22630 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
22640 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22650 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
22660 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22670 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
22680 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  se, pTabItem->pT
22690 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20  ab, -1, iCur, . 
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64          regRowid
226d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
226e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
226f0 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
22700 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
22710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
22740 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
22750 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
22760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
22770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22780 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22790 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
227a0 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
227b0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
227c0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
227d0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
227e0 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
227f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
22800 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
22810 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
22820 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
22830 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
22840 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
22850 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
22860 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
22870 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
22880 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
22890 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
228a0 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
228b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
228c0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
228d0 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
228e0 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
228f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
22900 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
22910 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
22920 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
22930 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
22940 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
22950 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
22960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
22980 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22990 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
229a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
229b0 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
229c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
229d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
229e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
229f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22a00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22a10 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
22a20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
22a30 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33  evel>1 ) sqlite3
22a40 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65  StackFree(pParse
22a50 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  ->db, pOrTab);. 
22a60 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
22a70 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
22a80 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
22a90 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
22aa0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
22ab0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
22ac0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
22ad0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
22ae0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
22af0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
22b00 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
22b10 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
22b20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
22b30 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
22b40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
22b50 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
22b60 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
22b70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
22b80 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
22b90 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
22ba0 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
22bb0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
22bc0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ev==1 );.    ass
22bd0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
22be0 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 );.    pLevel-
22bf0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
22c00 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
22c10 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
22c20 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
22c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22c40 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
22c50 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
22c60 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
22c70 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
22c80 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
22c90 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61  EP;.  }.  notRea
22ca0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
22cb0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
22cc0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
22cd0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
22ce0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
22cf0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
22d00 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
22d10 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
22d20 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
22d30 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
22d40 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
22d50 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30  N-OF: R-49525-50
22d60 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63  935 Terms that c
22d70 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69  annot be satisfi
22d80 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
22d90 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63  the use of indic
22da0 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20  es become tests 
22db0 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74  that are evaluat
22dc0 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20  ed against each 
22dd0 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  row of.  ** the 
22de0 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74  relevant input t
22df0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20  ables..  */.  k 
22e00 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
22e10 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
22e20 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
22e30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
22e40 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73  xpr *pE;.    tes
22e50 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
22e60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
22e70 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a 20  TUAL ); /* IMP: 
22e80 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
22e90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
22ea0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
22eb0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
22ec0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
22ed0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
22ee0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
22ef0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22f00 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
22f10 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
22f20 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  y)!=0 ){.      t
22f30 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
22f40 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d 3d  >untestedTerms==
22f50 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
22f60 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
22f70 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22f80 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21 3d  ONETABLE_ONLY)!=
22f90 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  0 );.      pWInf
22fa0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
22fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
22fc0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
22fd0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
22fe0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
22ff0 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  E!=0 );.    if( 
23000 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23010 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
23020 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
23030 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
23040 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
23050 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23060 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
23070 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  E, addrCont, SQL
23080 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
23090 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20  .    k = 1;.    
230a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
230b0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
230c0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  }..  /* For a LE
230d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
230e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
230f0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
23100 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a  e fact that.  **
23110 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
23120 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
23130 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
23140 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
23150 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c    .  */.  if( pL
23160 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23170 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  ){.    pLevel->a
23180 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74  ddrFirst = sqlit
23190 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
231a0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
231b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
231c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c  P_Integer, 1, pL
231d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
231e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
231f0 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
23200 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
23210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23220 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
23230 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  );.    for(pTerm
23240 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c  =pWC->a, j=0; j<
23250 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  pWC->nTerm; j++,
23260 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
23270 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
23280 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
23290 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20  _VIRTUAL );  /* 
232a0 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36  IMP: R-30575-116
232b0 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  62 */.      test
232c0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
232d0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
232e0 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  D );.      if( p
232f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
23300 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
23310 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
23320 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
23330 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
23340 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
23350 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
23360 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65  rt( pWInfo->unte
23370 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20  stedTerms );.   
23380 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
233a0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
233b0 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r );.      sqlit
233c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
233d0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
233e0 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pr, addrCont, SQ
233f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23400 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
23410 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
23420 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ODED;.    }.  }.
23430 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23440 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23450 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20  iReleaseReg);.. 
23460 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79   return notReady
23470 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
23480 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
23490 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
234a0 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
234b0 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
234c0 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
234d0 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
234e0 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
234f0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
23500 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
23510 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
23520 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
23530 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
23540 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
23550 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23560 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
23570 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
23580 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
23590 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
235a0 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
235b0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
235c0 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
235d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
235e0 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
235f0 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
23600 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
23610 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
23620 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  /.../*.** Free a
23630 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
23640 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
23650 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
23660 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
23670 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
23680 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
23690 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69  pWInfo) ){.    i
236a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
236b0 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0; i<pWInfo->nLe
236c0 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
236d0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
236e0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49  nfo *pInfo = pWI
236f0 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e  nfo->a[i].pIdxIn
23700 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
23710 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  nfo ){.        /
23720 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d  * assert( pInfo-
23730 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
23740 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  r==0 || db->mall
23750 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20  ocFailed ); */. 
23760 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
23770 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
23780 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
23790 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
237a0 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  fo->idxStr);.   
237b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
237c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
237d0 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d   pInfo);.      }
237e0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
237f0 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[i].plan.wsF
23800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
23810 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20  P_INDEX ){.     
23820 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
23830 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
23840 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20  an.u.pIdx;.     
23850 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
23860 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23870 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d  DbFree(db, pIdx-
23880 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
23890 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
238a0 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20  ee(db, pIdx);.  
238b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
238c0 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43      }.    whereC
238d0 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66  lauseClear(pWInf
238e0 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c  o->pWC);.    sql
238f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23900 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
23910 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
23920 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
23930 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
23940 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
23950 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
23960 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
23970 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
23980 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
23990 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
239a0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
239b0 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
239c0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
239d0 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
239e0 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
239f0 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
23a00 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
23a10 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
23a20 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
23a30 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
23a40 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
23a50 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
23a60 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
23a70 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23a80 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
23a90 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
23aa0 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
23ab0 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
23ac0 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
23ad0 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
23ae0 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
23af0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
23b00 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
23b10 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
23b20 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
23b30 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
23b40 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
23b50 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
23b60 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
23b70 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
23b80 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
23b90 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
23ba0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
23bb0 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
23bc0 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
23bd0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
23be0 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
23bf0 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
23c00 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23c10 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
23c20 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
23c30 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23c40 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
23c50 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
23c60 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23c70 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23c80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
23c90 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
23ca0 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
23cb0 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
23cc0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
23ce0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
23cf0 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
23d20 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
23d30 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
23d60 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
23d70 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
23d80 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
23d90 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
23da0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
23db0 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
23dc0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
23dd0 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
23de0 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
23df0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
23e00 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
23e10 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
23e20 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
23e30 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
23e40 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
23e50 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
23e60 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
23e70 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
23e80 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
23e90 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
23ea0 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
23eb0 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
23ec0 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
23ed0 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
23ee0 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
23ef0 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
23f00 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
23f10 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
23f20 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
23f30 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
23f40 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
23f50 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
23f60 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
23f70 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
23f80 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
23f90 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
23fa0 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
23fb0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
23fc0 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
23fd0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
23fe0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
23ff0 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
24000 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
24010 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
24020 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
24030 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
24040 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
24050 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
24060 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
24070 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
24080 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
24090 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
240a0 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
240b0 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
240c0 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
240d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
240e0 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
240f0 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
24100 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
24110 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
24120 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
24130 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
24140 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
24150 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
24160 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
24170 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
24180 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
24190 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
241a0 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
241b0 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
241c0 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
241d0 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
241e0 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
241f0 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
24200 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
24210 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
24220 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
24230 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
24240 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
24250 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
24260 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
24270 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
24280 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
24290 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
242a0 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
242b0 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
242c0 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
242d0 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
242e0 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
242f0 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
24300 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
24310 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
24320 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
24330 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
24340 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
24350 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
24360 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
24370 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
24380 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
24390 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
243a0 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
243b0 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
243c0 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
243d0 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
243e0 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
243f0 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
24400 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
24410 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
24420 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
24430 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
24440 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
24450 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
24460 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
24470 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
24480 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
24490 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
244a0 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
244b0 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
244c0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
244d0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
244e0 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
244f0 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
24500 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
24510 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
24520 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
24530 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
24540 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
24550 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
24560 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
24570 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
24580 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
24590 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
245a0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
245b0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
245c0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
245d0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
245e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
245f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
24600 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
24610 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
24620 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
24630 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
24640 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
24650 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
24660 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
24670 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
24680 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
24690 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
246a0 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
246b0 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
246c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
246d0 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
246e0 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
246f0 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
24700 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
24710 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
24720 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
24730 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
24740 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
24750 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
24760 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
24770 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
24780 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
24790 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
247a0 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
247b0 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
247c0 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
247d0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
247e0 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
247f0 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
24800 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
24810 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
24820 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
24830 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
24840 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24850 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
24860 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
24870 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24880 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
24890 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
248a0 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
248b0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
248c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
248d0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
248e0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
248f0 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
24900 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
24910 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ULL */.  u16 wct
24920 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 2f  rlFlags        /
24930 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
24940 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
24950 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
24960 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
24990 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  nter */.  int nB
249a0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
249b0 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
249c0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
249d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
249e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
249f0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
24a00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
24a10 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
24a20 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
24a30 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
24a40 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
24a50 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
24a60 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
24a70 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
24a80 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24a90 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
24aa0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
24ab0 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
24ac0 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
24ad0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
24ae0 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
24af0 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
24b00 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
24b10 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
24b20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
24b30 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
24b40 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20  Clause *pWC;    
24b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
24b60 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
24b70 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24b80 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
24b90 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
24ba0 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
24bb0 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
24bc0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
24bd0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
24be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
24bf0 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
24c00 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
24c10 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
24c40 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
24c50 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
24c60 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
24c70 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
24c80 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
24c90 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77 74   all pWC->a[].wt
24ca0 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  Flags */.  sqlit
24cb0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
24cc0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
24cd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
24ce0 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
24cf0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
24d00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
24d10 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
24d20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
24d30 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
24d40 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73   .  */.  testcas
24d50 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  e( pTabList->nSr
24d60 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20  c==BMS );.  if( 
24d70 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
24d80 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
24d90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24da0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
24db0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
24dc0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
24dd0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  n 0;.  }..  /* T
24de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  his function nor
24df0 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20  mally generates 
24e00 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f  a nested loop fo
24e10 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  r all tables in 
24e20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20  .  ** pTabList. 
24e30 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52   But if the WHER
24e40 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20  E_ONETABLE_ONLY 
24e50 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
24e60 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  n we should.  **
24e70 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63   only generate c
24e80 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73  ode for the firs
24e90 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  t table in pTabL
24ea0 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74  ist and assume t
24eb0 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72  hat.  ** any cur
24ec0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
24ed0 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20  with subsequent 
24ee0 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69  tables are unini
24ef0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
24f00 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74   nTabList = (wct
24f10 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
24f20 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f  ONETABLE_ONLY) ?
24f30 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e   1 : pTabList->n
24f40 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  Src;..  /* Alloc
24f50 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
24f60 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  ze the WhereInfo
24f70 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
24f80 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a  will become the.
24f90 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
24fa0 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  e. A single allo
24fb0 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  cation is used t
24fc0 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72  o store the Wher
24fd0 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63  eInfo.  ** struc
24fe0 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
24ff0 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d  of WhereInfo.a[]
25000 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  , the WhereClaus
25010 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
25020 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61   and the WhereMa
25030 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e  skSet structure.
25040 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75   Since WhereClau
25050 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38  se contains an 8
25060 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64  -byte.  ** field
25070 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20   (type Bitmask) 
25080 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e  it must be align
25090 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20  ed on an 8-byte 
250a0 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a  boundary on.  **
250b0 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75   some architectu
250c0 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52  res. Hence the R
250d0 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20  OUND8() below.. 
250e0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
250f0 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57 49  e->db;.  nByteWI
25100 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  nfo = ROUND8(siz
25110 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28  eof(WhereInfo)+(
25120 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65  nTabList-1)*size
25130 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
25140 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
25150 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
25160 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
25170 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
25180 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
25190 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
251a0 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
251b0 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
251c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
251d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
251e0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
251f0 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20    pWInfo = 0;.  
25200 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
25210 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57  nError;.  }.  pW
25220 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  Info->nLevel = n
25230 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
25240 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
25250 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
25260 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
25270 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
25280 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
25290 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
252a0 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
252b0 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
252c0 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
252d0 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
252e0 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
252f0 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
25300 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  gs;.  pWInfo->sa
25310 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
25320 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
25330 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  op;.  pMaskSet =
25340 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
25350 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53  &pWC[1];..  /* S
25360 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
25370 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
25380 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
25390 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
253a0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
253b0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
253c0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
253d0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
253e0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
253f0 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
25400 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
25410 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
25420 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
25430 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
25440 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
25450 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
25460 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49 4d  TK_AND);   /* IM
25470 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39 36  P: R-15842-53296
25480 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70   */.    .  /* Sp
25490 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
254a0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
254b0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
254c0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
254d0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
254e0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
254f0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
25500 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
25510 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
25520 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20  && (nTabList==0 
25530 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
25540 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
25550 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
25560 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25570 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
25580 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
25590 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
255a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
255b0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
255c0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
255d0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
255e0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
255f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
25600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
25610 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
25620 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
25630 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
25640 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
25650 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
25660 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
25670 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
25680 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
25690 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
256a0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
256b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
256c0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
256d0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
256e0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
256f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
25700 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
25710 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
25720 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
25730 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
25740 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
25750 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
25760 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
25770 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
25780 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
25790 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
257a0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
257b0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
257c0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
257d0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
257e0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
257f0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
25800 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
25810 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
25820 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
25830 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
25840 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
25850 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67    **.  ** Config
25860 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c 61  ure the WhereCla
25870 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61 62  use.vmask variab
25880 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73 20  le so that bits 
25890 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a  that correspond.
258a0 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c 20    ** to virtual 
258b0 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72  table cursors ar
258c0 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75  e set. This is u
258d0 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76 65  sed to selective
258e0 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a  ly disable .  **
258f0 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72   the OR-to-IN tr
25900 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20  ansformation in 
25910 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
25920 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20 68  m(). It is not h
25930 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74  elpful .  ** wit
25940 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
25950 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
25960 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
25970 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
25980 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
25990 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
259a0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
259b0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
259c0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
259d0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
259e0 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
259f0 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
25a00 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
25a10 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
25a20 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
25a30 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c  ONETABLE_ONLY fl
25a40 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  ag is set..  */.
25a50 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 76    assert( pWC->v
25a60 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73 6b  mask==0 && pMask
25a70 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 66  Set->n==0 );.  f
25a80 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
25a90 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
25aa0 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 70      createMask(p
25ab0 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
25ac0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
25ad0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25ae0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
25af0 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  LE.    if( ALWAY
25b00 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  S(pTabList->a[i]
25b10 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72 74  .pTab) && IsVirt
25b20 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ual(pTabList->a[
25b30 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  i].pTab) ){.    
25b40 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d 20    pWC->vmask |= 
25b50 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20 69  ((Bitmask)1 << i
25b60 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
25b70 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
25b80 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61  UG.  {.    Bitma
25b90 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30  sk toTheLeft = 0
25ba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25bb0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
25bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74   i++){.      Bit
25bd0 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b  mask m = getMask
25be0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
25bf0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
25c00 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
25c10 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
25c20 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
25c30 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
25c40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
25c50 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
25c60 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
25c70 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
25c80 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
25c90 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
25ca0 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
25cb0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
25cc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25cd0 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
25ce0 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
25cf0 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
25d00 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
25d10 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
25d20 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
25d30 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
25d40 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
25d50 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
25d60 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
25d70 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
25d80 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
25d90 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  pWC);.  if( db->
25da0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
25db0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
25dc0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20  ginError;.  }.. 
25dd0 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
25de0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
25df0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
25e00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25e10 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
25e20 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
25e30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
25e40 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
25e50 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
25e60 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
25e70 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
25e80 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
25e90 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
25ea0 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
25eb0 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
25ec0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
25ed0 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
25ee0 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
25ef0 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
25f00 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
25f10 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
25f20 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
25f30 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
25f40 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
25f50 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
25f60 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
25f70 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
25f80 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
25f90 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
25fa0 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
25fb0 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
25fc0 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
25fd0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
25fe0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
25ff0 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
26000 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
26010 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
26020 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
26030 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
26040 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
26050 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
26060 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
26070 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
26080 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
26090 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
260a0 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62   pTabItem = pTab
260b0 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65  List->a;.  pLeve
260c0 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
260d0 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a   andFlags = ~0;.
260e0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
260f0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
26100 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
26110 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
26120 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
26130 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
26140 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
26150 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
26160 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
26170 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
26180 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
26190 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
261a0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
261b0 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
261c0 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
261d0 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
261e0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
261f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
26200 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
26210 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
26220 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
26230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26240 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
26250 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
26280 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
26290 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
262a0 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
262b0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
262c0 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
262d0 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
262e0 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
262f0 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
26300 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
26310 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
26320 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
26330 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
26340 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
26350 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
26360 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
26370 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
26380 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
26390 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
263a0 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
263b0 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
263c0 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 20 20 2f 2a  BIG_DBL;..    /*
263d0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
263e0 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72  e remaining entr
263f0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
26400 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74  clause to find t
26410 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e  he.    ** next n
26420 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20  ested loop. The 
26430 6c 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46  loop tests all F
26440 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69  ROM clause entri
26450 65 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72  es.    ** either
26460 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20   once or twice. 
26470 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
26480 68 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73  he first test is
26490 20 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65   always performe
264a0 64 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74  d if there are t
264b0 77 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69  wo or more entri
264c0 65 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e  es.    ** remain
264d0 69 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65  ing and never pe
264e0 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
264f0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f   is only one FRO
26500 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20  M clause entry. 
26510 20 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20     ** to choose 
26520 66 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74  from.  The first
26530 20 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20   test looks for 
26540 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61  an "optimal" sca
26550 6e 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68  n.  In.    ** th
26560 69 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70  is context an op
26570 74 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e  timal scan is on
26580 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
26590 73 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20  same strategy.  
265a0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76    ** for the giv
265b0 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  en FROM clause e
265c0 6e 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65  ntry as would be
265d0 20 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65   selected if the
265e0 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65   entry.    ** we
265f0 72 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69  re used as the i
26600 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20  nnermost nested 
26610 6c 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20  loop.  In other 
26620 77 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20  words, a table. 
26630 20 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20     ** is chosen 
26640 73 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f  such that the co
26650 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68  st of running th
26660 61 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  at table cannot 
26670 62 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a  be reduced.    *
26680 2a 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72  * by waiting for
26690 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f   other tables to
266a0 20 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69   run first.  Thi
266b0 73 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74  s "optimal" test
266c0 20 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79   works.    ** by
266d0 20 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20   first assuming 
266e0 74 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c  that the FROM cl
266f0 61 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69  ause is on the i
26700 6e 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69  nner loop and fi
26710 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73  nding.    ** its
26720 20 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65   query plan, the
26730 6e 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  n checking to se
26740 65 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20  e if that query 
26750 70 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20  plan uses any.  
26760 20 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20    ** other FROM 
26770 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
26780 74 20 61 72 65 20 6e 6f 74 52 65 61 64 79 2e 20  t are notReady. 
26790 20 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20   If no notReady 
267a0 74 65 72 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a  terms are.    **
267b0 20 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22   used then the "
267c0 6f 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70  optimal" query p
267d0 6c 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a  lan works..    *
267e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
267f0 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ond loop iterati
26800 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f  on is only perfo
26810 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d  rmed if no optim
26820 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73  al scan.    ** s
26830 74 72 61 74 65 67 69 65 73 20 77 65 72 65 20 66  trategies were f
26840 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69 72 73  ound by the firs
26850 74 20 6c 6f 6f 70 2e 20 54 68 69 73 20 32 6e 64  t loop. This 2nd
26860 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 75 73   iteration is us
26870 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 61  ed to.    ** sea
26880 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  rch for the lowe
26890 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65  st cost scan ove
268a0 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rall..    **.   
268b0 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72   ** Previous ver
268c0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
268d0 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74  performed only t
268e0 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
268f0 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65  ion -.    ** the
26900 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20   next outermost 
26910 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20  loop was always 
26920 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f  that with the lo
26930 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20  west overall.   
26940 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65   ** cost. Howeve
26950 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68  r, this meant th
26960 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20  at SQLite could 
26970 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67  select the wrong
26980 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72   plan.    ** for
26990 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61 73   scripts such as
269a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
269b0 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a      **   .    **
269c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
269d0 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a  t1(a, b); .    *
269e0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
269f0 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a   t2(c, d);.    *
26a00 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
26a10 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  M t2, t1 WHERE t
26a20 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a  2.rowid = t1.a;.
26a30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
26a40 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79 20  e best strategy 
26a50 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  is to iterate th
26a60 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20 66  rough table t1 f
26a70 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74  irst. However it
26a80 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  .    ** is not p
26a90 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72  ossible to deter
26aa0 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20 61  mine this with a
26ab0 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61   simple greedy a
26ac0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a  lgorithm..    **
26ad0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
26ae0 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
26af0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
26b00 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68  h table t2 is th
26b10 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61  e same .    ** a
26b20 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  s the cost of a 
26b30 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
26b40 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20  ugh table t1, a 
26b50 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20  simple greedy . 
26b60 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20     ** algorithm 
26b70 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73  may choose to us
26b80 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74  e t2 for the out
26b90 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69  er loop, which i
26ba0 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20  s a much.    ** 
26bb0 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63  costlier approac
26bc0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55  h..    */.    nU
26bd0 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d 20 30  nconstrained = 0
26be0 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64  ;.    notIndexed
26bf0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 73   = 0;.    for(is
26c00 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e  Optimal=(iFrom<n
26c10 54 61 62 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70  TabList-1); isOp
26c20 74 69 6d 61 6c 3e 3d 30 3b 20 69 73 4f 70 74 69  timal>=0; isOpti
26c30 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  mal--){.      Bi
26c40 74 6d 61 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20  tmask mask;     
26c50 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
26c60 6f 66 20 74 61 62 6c 65 73 20 6e 6f 74 20 79 65  of tables not ye
26c70 74 20 72 65 61 64 79 20 2a 2f 0a 20 20 20 20 20  t ready */.     
26c80 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
26c90 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
26ca0 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69  ->a[j]; j<nTabLi
26cb0 73 74 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65  st; j++, pTabIte
26cc0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  m++){.        in
26cd0 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20  t doNotReorder; 
26ce0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
26cf0 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  is table should 
26d00 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64  not be reordered
26d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72   */.        Wher
26d20 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20  eCost sCost;    
26d30 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61   /* Cost informa
26d40 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56  tion from best[V
26d50 69 72 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a  irtual]Index() *
26d60 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
26d70 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f  st *pOrderBy;  /
26d80 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
26d90 65 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f  e for index to o
26da0 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20  ptimize */.  .  
26db0 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64        doNotReord
26dc0 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d  er =  (pTabItem-
26dd0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  >jointype & (JT_
26de0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
26df0 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
26e00 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f  j!=iFrom && doNo
26e10 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
26e20 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65  ;.        m = ge
26e30 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
26e40 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
26e50 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26e60 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
26e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
26e80 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
26e90 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  rom++;.         
26ea0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
26eb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73     }.        mas
26ec0 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f  k = (isOptimal ?
26ed0 20 6d 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a   m : notReady);.
26ee0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
26ef0 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f   = ((i==0 && ppO
26f00 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65  rderBy )?*ppOrde
26f10 72 42 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  rBy:0);.        
26f20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49  if( pTabItem->pI
26f30 6e 64 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e  ndex==0 ) nUncon
26f40 73 74 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20  strained++;.  . 
26f50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26f60 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b  TabItem->pTab );
26f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
26f90 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
26fa0 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
26fb0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
26fc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
26fd0 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26  ex_info **pp = &
26fe0 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64  pWInfo->a[j].pId
26ff0 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  xInfo;.         
27000 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
27010 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
27020 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70  TabItem, mask, p
27030 4f 72 64 65 72 42 79 2c 20 26 73 43 6f 73 74 2c  OrderBy, &sCost,
27040 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   pp);.        }e
27050 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
27060 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
27070 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
27080 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
27090 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64  Item, mask, pOrd
270a0 65 72 42 79 2c 20 26 73 43 6f 73 74 29 3b 0a 20  erBy, &sCost);. 
270b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
270c0 20 61 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d   assert( isOptim
270d0 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65  al || (sCost.use
270e0 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  d&notReady)==0 )
270f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
27100 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
27110 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
27120 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61 6e 20  , then the plan 
27130 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a 20 20  must use that.  
27140 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69        ** index i
27150 66 20 69 74 20 75 73 65 73 20 61 6e 79 20 69 6e  f it uses any in
27160 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20  dex at all */.  
27170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
27180 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d  abItem->pIndex==
27190 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
271a0 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70       || (sCost.p
271b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
271c0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
271d0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
271e0 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e         || sCost.
271f0 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61  plan.u.pIdx==pTa
27200 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b  bItem->pIndex );
27210 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ..        if( is
27220 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43 6f 73  Optimal && (sCos
27230 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
27240 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
27250 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  CAN)==0 ){.     
27260 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20       notIndexed 
27270 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  |= m;.        }.
27280 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
27290 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69  itions under whi
272a0 63 68 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  ch this table be
272b0 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20 73  comes the best s
272c0 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a  o far:.        *
272d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
272e0 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73  1) The table mus
272f0 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20  t not depend on 
27300 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 68 61  other tables tha
27310 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20  t have not.     
27320 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20     **       yet 
27330 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  run..        **.
27340 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32 29          **   (2)
27350 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63   A full-table-sc
27360 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73  an plan cannot s
27370 75 70 65 72 63 65 64 65 20 61 6e 6f 74 68 65 72  upercede another
27380 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20   plan unless.   
27390 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 74       **       it
273a0 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22   is an "optimal"
273b0 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e 65 64   plan as defined
273c0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
273d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
273e0 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68  (3) All tables h
273f0 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42  ave an INDEXED B
27400 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73  Y clause or this
27410 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a   table lacks an.
27420 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
27430 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
27440 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
27450 20 75 73 65 73 20 74 68 65 20 73 70 65 63 69 66   uses the specif
27460 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ic.        **   
27470 20 20 20 20 69 6e 64 65 78 20 73 70 65 63 69 66      index specif
27480 69 65 64 20 62 79 20 69 74 73 20 49 4e 44 45 58  ied by its INDEX
27490 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ED BY clause.  T
274a0 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73  his rule ensures
274b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
274c0 20 20 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f    that a best-so
274d0 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73 20 73  -far is always s
274e0 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  elected even if 
274f0 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20  an impossible.  
27500 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63        **       c
27510 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e  ombination of IN
27520 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 73  DEXED BY clauses
27530 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65   are given.  The
27540 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a   error.        *
27550 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20  *       will be 
27560 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c  detected and rel
27570 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ayed back to the
27580 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74   application lat
27590 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  er..        **  
275a0 20 20 20 20 20 54 68 65 20 4e 45 56 45 52 28 29       The NEVER()
275b0 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63   comes about bec
275c0 61 75 73 65 20 72 75 6c 65 20 28 32 29 20 61 62  ause rule (2) ab
275d0 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20  ove prevents.   
275e0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e       **       An
275f0 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d   indexable full-
27600 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20  table-scan from 
27610 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33  reaching rule (3
27620 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
27630 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54        **   (4) T
27640 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73  he plan cost mus
27650 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20  t be lower than 
27660 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65  prior plans or e
27670 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  lse the.        
27680 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20 6d 75  **       cost mu
27690 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
276a0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
276b0 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20 6c 6f   rows must be lo
276c0 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wer..        */.
276d0 20 20 20 20 20 20 20 20 69 66 28 20 28 73 43 6f          if( (sCo
276e0 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79  st.used&notReady
276f0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
27700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
27710 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
27720 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20   && (bestJ<0 || 
27730 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29 21 3d  (notIndexed&m)!=
27740 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
27750 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
27760 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
27770 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  ost.plan.wsFlags
27780 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
27790 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20 20 20 20  LSCAN)!=0).     
277a0 20 20 20 20 20 20 20 26 26 20 28 6e 55 6e 63 6f         && (nUnco
277b0 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20  nstrained==0 || 
277c0 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
277d0 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  ==0   /* (3) */.
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f 73 74 2e  || NEVER((sCost.
27800 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
27810 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
27820 4e 29 21 3d 30 29 29 0a 20 20 20 20 20 20 20 20  N)!=0)).        
27830 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20      && (bestJ<0 
27840 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62  || sCost.rCost<b
27850 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20  estPlan.rCost   
27860 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
27880 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65  (sCost.rCost<=be
27890 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 26 26 20  stPlan.rCost && 
278a0 73 43 6f 73 74 2e 6e 52 6f 77 3c 62 65 73 74 50  sCost.nRow<bestP
278b0 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20  lan.nRow)).     
278c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
278d0 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
278e0 20 62 65 73 74 20 73 6f 20 66 61 72 20 77 69 74   best so far wit
278f0 68 20 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52  h cost=%g and nR
27900 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20  ow=%g\n",.      
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43 6f  sCost.rCost, sCo
27930 73 74 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20  st.nRow));.     
27940 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20       bestPlan = 
27950 73 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  sCost;.         
27960 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20   bestJ = j;.    
27970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27980 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  ( doNotReorder )
27990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
279a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
279b0 28 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20  ( bestJ>=0 );.  
279c0 20 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61    assert( notRea
279d0 64 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  dy & getMask(pMa
279e0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
279f0 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
27a00 72 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54  r) );.    WHERET
27a10 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
27a20 69 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61 62  izer selects tab
27a30 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25  le %d for loop %
27a40 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20 20  d\n", bestJ,.   
27a50 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 70          pLevel-p
27a60 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20 20  WInfo->a));.    
27a70 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c  if( (bestPlan.pl
27a80 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27a90 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29  RE_ORDERBY)!=0 )
27aa0 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  {.      *ppOrder
27ab0 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
27ac0 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
27ad0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
27ae0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
27af0 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e  >plan = bestPlan
27b00 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63  .plan;.    testc
27b10 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
27b20 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27b30 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
27b40 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
27b50 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
27b60 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
27b70 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20  NDEX );.    if( 
27b80 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
27b90 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
27ba0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d  NDEXED|WHERE_TEM
27bb0 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  P_INDEX) ){.    
27bc0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
27bd0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
27be0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
27bf0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
27c00 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
27c10 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
27c20 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
27c30 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
27c40 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
27c50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
27c60 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
27c70 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
27c80 2e 6e 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31  .nRow>=(double)1
27c90 20 29 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   ) pParse->nQuer
27ca0 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61  yLoop *= bestPla
27cb0 6e 2e 6e 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20  n.nRow;..    /* 
27cc0 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68  Check that if th
27cd0 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20  e table scanned 
27ce0 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65  by this loop ite
27cf0 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20  ration had an.  
27d00 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20    ** INDEXED BY 
27d10 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20  clause attached 
27d20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20  to it, that the 
27d30 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62  named index is b
27d40 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64  eing.    ** used
27d50 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49   for the scan. I
27d60 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72  f not, then quer
27d70 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61  y compilation ha
27d80 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a  s failed..    **
27d90 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
27da0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  ..    */.    pId
27db0 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  x = pTabList->a[
27dc0 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20  bestJ].pIndex;. 
27dd0 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
27de0 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c       if( (bestPl
27df0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
27e00 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
27e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
27e20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27e30 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75  Parse, "cannot u
27e40 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70  se index: %s", p
27e50 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
27e60 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42       goto whereB
27e70 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  eginError;.     
27e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27e90 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
27ea0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73   BY clause is us
27eb0 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65  ed, the bestInde
27ec0 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  x() function is.
27ed0 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
27ee0 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68  nteed to find th
27ef0 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65  e index specifie
27f00 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44  d in the INDEXED
27f10 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20   BY clause.     
27f20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64     ** if it find
27f30 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c   an index at all
27f40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
27f50 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ert( bestPlan.pl
27f60 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20  an.u.pIdx==pIdx 
27f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27f80 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
27f90 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
27fa0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
27fb0 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  "));.  if( pPars
27fc0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
27fd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
27fe0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
27ff0 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
28000 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
28010 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
28020 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
28030 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
28040 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
28050 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
28060 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
28070 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
28080 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72  E)!=0 && ppOrder
28090 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64  By ){.    *ppOrd
280a0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
280b0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
280c0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
280d0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
280e0 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
280f0 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
28100 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
28110 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
28120 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
28130 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
28140 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
28150 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
28160 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
28170 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
28180 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
28190 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20  ent to update a 
281a0 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f  single row..  */
281b0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
281c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
281d0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
281e0 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
281f0 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
28200 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28210 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
28220 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64  IRED)!=0 && (and
28230 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
28240 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
28250 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
28260 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
28270 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[0].plan.wsF
28280 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
28290 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
282a0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
282b0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
282c0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
282d0 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
282e0 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
282f0 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
28300 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
28310 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
28320 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
28330 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
28340 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
28350 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
28360 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
28370 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
28380 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74  o->a; i<nTabList
28390 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
283a0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
283b0 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
283c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
283d0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
283e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
283f0 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
28400 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a  table/index */..
28410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28420 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
28430 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
28440 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ain==2 ){.      
28450 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
28460 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28470 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
28480 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
28490 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
284a0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
284b0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41 42  MPrintf(db, "TAB
284c0 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  LE %s", pItem->z
284d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
284e0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
284f0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
28500 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
28510 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41  (db, zMsg, "%s A
28520 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
28530 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
28540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
28550 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
28570 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  P_INDEX)!=0 ){. 
28580 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
28590 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
285a0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 57 49 54 48  , zMsg, "%s WITH
285b0 20 41 55 54 4f 4d 41 54 49 43 20 49 4e 44 45 58   AUTOMATIC INDEX
285c0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
285d0 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65  }else if( (pLeve
285e0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
285f0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
28600 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
28610 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
28620 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
28630 22 25 73 20 57 49 54 48 20 49 4e 44 45 58 20 25  "%s WITH INDEX %
28640 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  s",.           z
28650 4d 73 67 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Msg, pLevel->pla
28660 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  n.u.pIdx->zName)
28670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28680 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
28690 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
286a0 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20  ULTI_OR ){.     
286b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
286c0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
286d0 73 67 2c 20 22 25 73 20 56 49 41 20 4d 55 4c 54  sg, "%s VIA MULT
286e0 49 2d 49 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20  I-INDEX UNION", 
286f0 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
28700 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
28710 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
28720 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
28730 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
28740 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
28750 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
28760 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
28770 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
28780 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
28790 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
287a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
287b0 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20  ABLE.      else 
287c0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
287d0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
287e0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
287f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28800 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
28810 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
28820 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
28830 62 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d  bIdx;.        zM
28840 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
28850 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
28860 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  %s VIRTUAL TABLE
28870 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a   INDEX %d:%s", z
28880 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
28890 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
288a0 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62  x->idxNum, pVtab
288b0 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  Idx->idxStr);.  
288c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
288d0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
288e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
288f0 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20  ERE_ORDERBY ){. 
28900 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
28910 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
28920 2c 20 7a 4d 73 67 2c 20 22 25 73 20 4f 52 44 45  , zMsg, "%s ORDE
28930 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20  R BY", zMsg);.  
28940 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
28950 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28960 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20   OP_Explain, i, 
28970 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30  pLevel->iFrom, 0
28980 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
28990 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
289a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
289b0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
289c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
289d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
289e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
289f0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
28a00 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  b;.    pLevel->i
28a10 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
28a20 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
28a30 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
28a40 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
28a50 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
28a60 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
28a70 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
28a80 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
28a90 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
28aa0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
28ab0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
28ac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28ad0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
28ae0 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
28af0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
28b00 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
28b10 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)!=0 ){.      
28b20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
28b30 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
28b40 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
28b50 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
28b60 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
28b70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
28b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28b90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28ba0 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20  VOpen, iCur, 0, 
28bb0 30 2c 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41  0, pVTab, P4_VTA
28bc0 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  B);.    }else.#e
28bd0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
28be0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
28bf0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
28c00 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
28c10 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
28c20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45  & WHERE_OMIT_OPE
28c30 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  N)==0 ){.      i
28c40 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nt op = pWInfo->
28c50 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f  okOnePass ? OP_O
28c60 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70  penWrite : OP_Op
28c70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71  enRead;.      sq
28c80 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
28c90 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
28ca0 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70  >iCursor, iDb, p
28cb0 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20  Tab, op);.      
28cc0 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e  testcase( pTab->
28cd0 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
28ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28cf0 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29  Tab->nCol==BMS )
28d00 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 57 49  ;.      if( !pWI
28d10 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
28d20 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53  & pTab->nCol<BMS
28d30 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   ){.        Bitm
28d40 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d  ask b = pTabItem
28d50 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
28d60 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
28d70 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62        for(; b; b
28d80 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  =b>>1, n++){}.  
28d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28da0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 73 71 6c  eChangeP4(v, sql
28db0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
28dc0 64 64 72 28 76 29 2d 31 2c 20 0a 20 20 20 20 20  ddr(v)-1, .     
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
28df0 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
28e00 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
28e10 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
28e20 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
28e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28e40 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
28e50 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
28e60 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
28e70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
28e80 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
28e90 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
28ea0 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
28eb0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
28ec0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d  lags & WHERE_TEM
28ed0 50 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  P_INDEX)!=0 ){. 
28ee0 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 41 75       constructAu
28ef0 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70 50 61  tomaticIndex(pPa
28f00 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
28f10 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  em, notReady, pL
28f20 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  evel);.    }else
28f30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
28f40 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
28f50 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
28f60 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
28f70 20 20 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20     Index *pIx = 
28f80 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
28f90 49 64 78 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  Idx;.      KeyIn
28fa0 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
28fb0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
28fc0 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20  Parse, pIx);.   
28fd0 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d     int iIdxCur =
28fe0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
28ff0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29000 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
29010 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
29020 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 64       assert( iId
29030 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  xCur>=0 );.     
29040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29050 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
29060 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  d, iIdxCur, pIx-
29070 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
290a0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
290b0 4f 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65  OFF);.      Vdbe
290c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
290d0 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  , pIx->zName));.
290e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
290f0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
29100 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
29110 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
29120 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d  ~getMask(pWC->pM
29130 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d  askSet, pTabItem
29140 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->iCursor);.  }.
29150 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
29160 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
29170 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
29180 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29190 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
291a0 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a  eginError;..  /*
291b0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
291c0 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
291d0 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
291e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
291f0 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
29200 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
29210 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
29220 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
29230 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
29240 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
29250 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
29260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62   for(i=0; i<nTab
29270 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  List; i++){.    
29280 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
29290 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
292a0 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c 61 67  fo, i, wctrlFlag
292b0 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20  s, notReady);.  
292c0 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
292d0 6e 75 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  nue = pWInfo->a[
292e0 69 5d 2e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  i].addrCont;.  }
292f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29300 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73  TEST  /* For tes
29310 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
29320 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20  ng use only */. 
29330 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68   /* Record in th
29340 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66  e query plan inf
29350 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
29360 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
29370 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  .  ** and the in
29380 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
29390 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20  ss it (if any). 
293a0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   If the table it
293b0 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  self.  ** is not
293c0 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20   used, its name 
293d0 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49  is just '{}'.  I
293e0 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73  f no index is us
293f0 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  ed.  ** the inde
29400 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22  x is listed as "
29410 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69  {}".  If the pri
29420 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
29430 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
29440 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a  name is '*'..  *
29450 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
29460 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20  TabList; i++){. 
29470 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
29480 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65  int n;.    pLeve
29490 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
294a0 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ];.    pTabItem 
294b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
294c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
294d0 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d     z = pTabItem-
294e0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28  >zAlias;.    if(
294f0 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62   z==0 ) z = pTab
29500 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
29510 65 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  e;.    n = sqlit
29520 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
29530 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
29540 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
29550 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20  _query_plan)-10 
29560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  ){.      if( pLe
29570 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
29580 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
29590 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  LY ){.        me
295a0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
295b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
295c0 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20  , "{}", 2);.    
295d0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
295e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
295f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
29600 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
29610 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b  [nQPlan], z, n);
29620 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
29630 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
29640 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
29650 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
29660 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
29670 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
29680 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
29690 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   & WHERE_ROWID_E
296a0 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
296b0 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
296c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
296d0 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20  ROWID_RANGE );. 
296e0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
296f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
29700 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
29710 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
29720 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
29730 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
29740 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a  plan[nQPlan], "*
29750 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51   ", 2);.      nQ
29760 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  Plan += 2;.    }
29770 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c  else if( (pLevel
29780 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29790 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
297a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 ){.      n = 
297b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
297c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
297d0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
297e0 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
297f0 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
29800 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29  _query_plan)-2 )
29810 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
29820 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
29830 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c  plan[nQPlan], pL
29840 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
29850 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  x->zName, n);.  
29860 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
29870 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  n;.        sqlit
29880 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
29890 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
298a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
298b0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
298c0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
298d0 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20  an[nQPlan], "{} 
298e0 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 3);.      nQP
298f0 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a  lan += 3;.    }.
29900 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50    }.  while( nQP
29910 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33  lan>0 && sqlite3
29920 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
29930 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  an-1]==' ' ){.  
29940 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
29950 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d  plan[--nQPlan] =
29960 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
29970 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
29980 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c  lan] = 0;.  nQPl
29990 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f  an = 0;.#endif /
299a0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f  * SQLITE_TEST //
299b0 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   Testing and deb
299c0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
299d0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  */..  /* Record 
299e0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
299f0 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
29a00 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
29a10 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20  ure.  Then.  ** 
29a20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  clean up and ret
29a30 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  urn..  */.  retu
29a40 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
29a50 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
29a60 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
29a70 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
29a80 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
29a90 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
29aa0 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
29ab0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
29ac0 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
29ad0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
29ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
29af0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
29b00 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
29b10 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
29b20 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
29b30 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
29b40 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
29b50 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
29b60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29b70 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
29b80 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
29b90 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
29ba0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
29bb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
29bc0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
29bd0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
29be0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
29bf0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
29c00 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
29c10 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
29c20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
29c30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
29c40 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
29c50 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  de..  */.  sqlit
29c60 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29c70 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
29c80 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i=pWInfo->nLevel
29c90 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
29ca0 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
29cb0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
29cc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29cd0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
29ce0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
29cf0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
29d00 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
29d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29d20 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
29d30 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
29d40 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
29d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
29d60 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
29d70 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
29d80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
29d90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
29da0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
29db0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
29dc0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
29dd0 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
29de0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
29df0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29e00 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
29e10 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
29e20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
29e30 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
29e40 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
29e50 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
29e60 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
29e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29e80 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
29e90 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
29ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
29ec0 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20  ext, pIn->iCur, 
29ed0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b  pIn->addrInTop);
29ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29ef0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
29f00 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31  pIn->addrInTop-1
29f10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29f20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
29f30 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
29f40 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
29f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29f60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
29f70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
29f80 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
29f90 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
29fa0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
29fb0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
29fc0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
29fd0 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c  OP_IfPos, pLevel
29fe0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
29ff0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65      assert( (pLe
2a000 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2a010 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2a020 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2a030 20 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    || (pLevel->pl
2a040 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a050 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2a060 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65  ;.      if( (pLe
2a070 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2a080 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2a090 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
2a0a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a0b0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
2a0c0 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
2a0d0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
2a0e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
2a0f0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
2a100 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a110 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2a120 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
2a130 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
2a140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a150 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2a160 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
2a170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a180 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2a190 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
2a1a0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
2a1b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a1c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a1d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2a1e0 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
2a1f0 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
2a200 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a210 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2a220 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  addr);.    }.  }
2a230 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61  ..  /* The "brea
2a240 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65  k" point is here
2a250 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20  , just past the 
2a260 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72  end of the outer
2a270 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20   loop..  ** Set 
2a280 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  it..  */.  sqlit
2a290 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2a2a0 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  el(v, pWInfo->iB
2a2b0 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  reak);..  /* Clo
2a2c0 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
2a2d0 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
2a2e0 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
2a2f0 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a  3WhereBegin..  *
2a300 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  /.  assert( pWIn
2a310 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c  fo->nLevel==1 ||
2a320 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2a330 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  =pTabList->nSrc 
2a340 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  );.  for(i=0, pL
2a350 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2a360 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
2a370 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
2a380 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2a390 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
2a3a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2a3b0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2a3c0 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
2a3d0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
2a3e0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2a3f0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2a400 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2a410 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2a420 61 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  al)==0.     && p
2a430 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a  Tab->pSelect==0.
2a440 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2a450 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2a460 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d  ERE_OMIT_CLOSE)=
2a470 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
2a480 69 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d  int ws = pLevel-
2a490 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  >plan.wsFlags;. 
2a4a0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
2a4b0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
2a4c0 77 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  ws & WHERE_IDX_O
2a4d0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
2a4e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a4f0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2a500 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2a510 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
2a520 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
2a530 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
2a540 26 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54  && (ws & WHERE_T
2a550 45 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b  EMP_INDEX)==0 ){
2a560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a570 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2a580 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
2a590 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2a5a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a5b0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
2a5c0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
2a5d0 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
2a5e0 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
2a5f0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
2a600 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
2a610 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
2a620 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
2a630 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
2a640 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
2a650 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
2a660 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
2a670 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
2a680 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
2a690 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
2a6a0 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
2a6b0 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
2a6c0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
2a6d0 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
2a6e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
2a6f0 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
2a700 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
2a710 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
2a720 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
2a730 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
2a740 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
2a750 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
2a760 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
2a770 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
2a780 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
2a790 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
2a7a0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
2a7b0 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
2a7c0 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
2a7d0 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
2a7e0 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
2a7f0 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
2a800 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
2a810 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
2a820 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
2a830 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
2a840 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
2a850 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
2a860 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
2a870 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2a880 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2a890 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2a8a0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2a8b0 61 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e  ailed){.      in
2a8c0 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20  t k, j, last;.  
2a8d0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
2a8e0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
2a8f0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
2a900 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20  n.u.pIdx;..     
2a910 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
2a920 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   );.      pOp = 
2a930 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2a940 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
2a950 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
2a960 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2a970 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2a980 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69   for(k=pWInfo->i
2a990 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  Top; k<last; k++
2a9a0 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2a9b0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
2a9c0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2a9d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a9e0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2a9f0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
2aa00 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
2aa10 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
2aa20 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
2aa30 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2aa40 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
2aa50 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
2aa60 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
2aa70 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
2aa80 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
2aa90 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2aaa0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2aab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2aac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2aae0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2aaf0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2ab00 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
2ab10 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64          || j<pId
2ab20 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
2ab30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ab40 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2ab50 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
2ab60 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
2ab70 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2ab80 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
2ab90 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
2aba0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2abb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2abc0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
2abd0 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
2abe0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2abf0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2ac00 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
2ac10 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
2ac20 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
2ac30 0a                                               .