/ Hex Artifact Content
Login

Artifact f4915ac03e5e42c8416b35ca3ba34af841c00d12:


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 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
14b0: 4e 55 4c 4c 20 20 20 20 20 20 30 78 38 30 20 20  NULL      0x80  
14c0: 20 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64   /* Manufactured
14d0: 20 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55   x>NULL or x<=NU
14e0: 4c 4c 20 74 65 72 6d 20 2a 2f 0a 0a 2f 2a 0a 2a  LL term */../*.*
14f0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1500: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1510: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61  tructure holds a
1520: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1530: 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20  bout a.** WHERE 
1540: 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20  clause.  Mostly 
1550: 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69  this is a contai
1560: 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  ner for one or m
1570: 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a  ore WhereTerms..
1580: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
1590: 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20  lause {.  Parse 
15a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
15b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15d0: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
15e0: 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet;  /* Mappin
15f0: 67 20 6f 66 20 74 61 62 6c 65 20 63 75 72 73 6f  g of table curso
1600: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
1610: 6d 61 73 6b 73 20 2a 2f 0a 20 20 42 69 74 6d 61  masks */.  Bitma
1620: 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20 20 20 20  sk vmask;       
1630: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 69      /* Bitmask i
1640: 64 65 6e 74 69 66 79 69 6e 67 20 76 69 72 74 75  dentifying virtu
1650: 61 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73  al table cursors
1660: 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20 20 20 20   */.  u8 op;    
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1680: 2a 20 53 70 6c 69 74 20 6f 70 65 72 61 74 6f 72  * Split operator
1690: 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f  .  TK_AND or TK_
16a0: 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  OR */.  int nTer
16b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
16d0: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c  rms */.  int nSl
16e0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
16f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1700: 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f  ntries in a[] */
1710: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1730: 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65  ach a[] describe
1740: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
1750: 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a  WHERE cluase */.
1760: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1770: 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a  TE_SMALL_STACK).
1780: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
1790: 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[1];    /* In
17a0: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
17b0: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
17c0: 6c 73 65 0a 20 20 57 68 65 72 65 54 65 72 6d 20  lse.  WhereTerm 
17d0: 61 53 74 61 74 69 63 5b 38 5d 3b 20 20 20 20 2f  aStatic[8];    /
17e0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
17f0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
1800: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1810: 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 77  ** A WhereTerm w
1820: 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57  ith eOperator==W
1830: 4f 5f 4f 52 20 68 61 73 20 69 74 73 20 75 2e 70  O_OR has its u.p
1840: 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73  OrInfo pointer s
1850: 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d  et to.** a dynam
1860: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1870: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1890: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
18a0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b 0a 20 20  WhereOrInfo {.  
18b0: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
18c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
18d0: 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74 6f 20 73  mposition into s
18e0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  ubterms */.  Bit
18f0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
1900: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1910: 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 61 62 6c   of all indexabl
1920: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1930: 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  clause */.};../*
1940: 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20  .** A WhereTerm 
1950: 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72 3d 3d  with eOperator==
1960: 57 4f 5f 41 4e 44 20 68 61 73 20 69 74 73 20 75  WO_AND has its u
1970: 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69 6e 74 65  .pAndInfo pointe
1980: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
1990: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
19a0: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
19b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
19c0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
19d0: 63 74 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20  ct WhereAndInfo 
19e0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
19f0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
1a00: 54 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  The subexpressio
1a10: 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a  n broken out */.
1a20: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
1a30: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1a40: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1a50: 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20   keeps track of 
1a60: 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74  a mapping.** bet
1a70: 77 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72  ween VDBE cursor
1a80: 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74   numbers and bit
1a90: 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  s of the bitmask
1aa0: 73 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a  s in WhereTerm..
1ab0: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63  **.** The VDBE c
1ac0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
1ad0: 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73  e small integers
1ae0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a   contained in .*
1af0: 2a 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69  * SrcList_item.i
1b00: 43 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e  Cursor and Expr.
1b10: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20  iTable fields.  
1b20: 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48  For any given WH
1b30: 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ERE .** clause, 
1b40: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1b50: 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67  rs might not beg
1b60: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74 68  in with 0 and th
1b70: 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74  ey might.** cont
1b80: 61 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20  ain gaps in the 
1b90: 6e 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e  numbering sequen
1ba0: 63 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74  ce.  But we want
1bb0: 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d   to make maximum
1bc0: 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62  .** use of the b
1bd0: 69 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61  its in our bitma
1be0: 73 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75 63  sks.  This struc
1bf0: 74 75 72 65 20 70 72 6f 76 69 64 65 73 20 61 20  ture provides a 
1c00: 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  mapping.** from 
1c10: 74 68 65 20 73 70 61 72 73 65 20 63 75 72 73 6f  the sparse curso
1c20: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63  r numbers into c
1c30: 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67  onsecutive integ
1c40: 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  ers beginning.**
1c50: 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49   with 0..**.** I
1c60: 66 20 57 68 65 72 65 4d 61 73 6b 53 65 74 2e 69  f WhereMaskSet.i
1c70: 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73  x[A]==B it means
1c80: 20 74 68 61 74 20 54 68 65 20 41 2d 74 68 20 62   that The A-th b
1c90: 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a  it of a Bitmask.
1ca0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56  ** corresponds V
1cb0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1cc0: 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62  r B.  The A-th b
1cd0: 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20  it of a bitmask 
1ce0: 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46  is 1<<A..**.** F
1cf0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1d00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d10: 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  expression used 
1d20: 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75  these VDBE.** cu
1d30: 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c  rsors:  4, 5, 8,
1d40: 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68   29, 57, 73.  Th
1d50: 65 6e 20 74 68 65 20 20 57 68 65 72 65 4d 61 73  en the  WhereMas
1d60: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a  kSet structure.*
1d70: 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73  * would map thos
1d80: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1d90: 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72   into bits 0 thr
1da0: 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ough 5..**.** No
1db0: 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70 70  te that the mapp
1dc0: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
1dd0: 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20  sarily ordered. 
1de0: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a   In the example.
1df0: 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61  ** above, the ma
1e00: 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c  pping might go l
1e10: 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c  ike this:  4->3,
1e20: 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d   5->1, 8->2, 29-
1e30: 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33  >0,.** 57->5, 73
1e40: 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20  ->4.  Or one of 
1e50: 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e  719 other combin
1e60: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20  ations might be 
1e70: 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73  used. It.** does
1e80: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74   not really matt
1e90: 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70  er.  What is imp
1ea0: 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20 73  ortant is that s
1eb0: 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20  parse cursor.** 
1ec0: 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20  numbers all get 
1ed0: 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20  mapped into bit 
1ee0: 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65 67  numbers that beg
1ef0: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f  in with 0 and co
1f00: 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73  ntain.** no gaps
1f10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
1f20: 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74  eMaskSet {.  int
1f30: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f50: 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64  mber of assigned
1f60: 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a   cursor values *
1f70: 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d 53 5d 3b  /.  int ix[BMS];
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69    /* Cursor assi
1fa0: 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74  gned to each bit
1fb0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
1fc0: 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
1fd0: 20 72 65 63 6f 72 64 73 20 61 20 6c 6f 6f 6b 75   records a looku
1fe0: 70 20 73 74 72 61 74 65 67 79 20 61 6e 64 20 74  p strategy and t
1ff0: 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a 2a 20  he estimated.** 
2000: 63 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67  cost of pursuing
2010: 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a   that strategy..
2020: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43  */.struct WhereC
2030: 6f 73 74 20 7b 0a 20 20 57 68 65 72 65 50 6c 61  ost {.  WherePla
2040: 6e 20 70 6c 61 6e 3b 20 20 20 20 2f 2a 20 54 68  n plan;    /* Th
2050: 65 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  e lookup strateg
2060: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 43  y */.  double rC
2070: 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4f 76 65  ost;      /* Ove
2080: 72 61 6c 6c 20 63 6f 73 74 20 6f 66 20 70 75 72  rall cost of pur
2090: 73 75 69 6e 67 20 74 68 69 73 20 73 65 61 72 63  suing this searc
20a0: 68 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  h strategy */.  
20b0: 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20 20 20  Bitmask used;   
20c0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
20d0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
20e0: 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a 7d 3b   this plan */.};
20f0: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
2100: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
2110: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
2120: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
2130: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
2140: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
2150: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
2160: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
2170: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
2180: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
2190: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
21a0: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
21b0: 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20 57 4f  0x001.#define WO
21c0: 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a 23 64  _EQ     0x002.#d
21d0: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
21e0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
21f0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
2200: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
2210: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
2230: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
2240: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
2250: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
2260: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
2270: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
2280: 43 48 20 20 30 78 30 34 30 0a 23 64 65 66 69 6e  CH  0x040.#defin
2290: 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78 30 38  e WO_ISNULL 0x08
22a0: 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f 52 20  0.#define WO_OR 
22b0: 20 20 20 20 30 78 31 30 30 20 20 20 20 20 20 20      0x100       
22c0: 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  /* Two or more O
22d0: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
22e0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
22f0: 41 4e 44 20 20 20 20 30 78 32 30 30 20 20 20 20  AND    0x200    
2300: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
2310: 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
2320: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
2330: 20 57 4f 5f 4e 4f 4f 50 20 20 20 30 78 38 30 30   WO_NOOP   0x800
2340: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74         /* This t
2350: 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 72 65 73  erm does not res
2360: 74 72 69 63 74 20 73 65 61 72 63 68 20 73 70 61  trict search spa
2370: 63 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 57  ce */..#define W
2380: 4f 5f 41 4c 4c 20 20 20 20 30 78 66 66 66 20 20  O_ALL    0xfff  
2390: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
23a0: 61 6c 6c 20 70 6f 73 73 69 62 6c 65 20 57 4f 5f  all possible WO_
23b0: 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  * values */.#def
23c0: 69 6e 65 20 57 4f 5f 53 49 4e 47 4c 45 20 30 78  ine WO_SINGLE 0x
23d0: 30 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  0ff       /* Mas
23e0: 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e 2d 63 6f 6d  k of all non-com
23f0: 70 6f 75 6e 64 20 57 4f 5f 2a 20 76 61 6c 75 65  pound WO_* value
2400: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  s */../*.** Valu
2410: 65 20 66 6f 72 20 77 73 46 6c 61 67 73 20 72 65  e for wsFlags re
2420: 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e  turned by bestIn
2430: 64 65 78 28 29 20 61 6e 64 20 73 74 6f 72 65 64  dex() and stored
2440: 20 69 6e 0a 2a 2a 20 57 68 65 72 65 4c 65 76 65   in.** WhereLeve
2450: 6c 2e 77 73 46 6c 61 67 73 2e 20 20 54 68 65 73  l.wsFlags.  Thes
2460: 65 20 66 6c 61 67 73 20 64 65 74 65 72 6d 69 6e  e flags determin
2470: 65 20 77 68 69 63 68 20 73 65 61 72 63 68 0a 2a  e which search.*
2480: 2a 20 73 74 72 61 74 65 67 69 65 73 20 61 72 65  * strategies are
2490: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a   appropriate..**
24a0: 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69  .** The least si
24b0: 67 6e 69 66 69 63 61 6e 74 20 31 32 20 62 69 74  gnificant 12 bit
24c0: 73 20 69 73 20 72 65 73 65 72 76 65 64 20 61 73  s is reserved as
24d0: 20 61 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20   a mask for WO_ 
24e0: 76 61 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a  values above..**
24f0: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2500: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 69 73  wsFlags field is
2510: 20 75 73 75 61 6c 6c 79 20 73 65 74 20 74 6f 20   usually set to 
2520: 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49  WO_IN|WO_EQ|WO_I
2530: 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66  SNULL..** But if
2540: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
2550: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2560: 20 61 20 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68   a left join, Wh
2570: 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73  ereLevel.wsFlags
2580: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 57 4f  .** is set to WO
2590: 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20 54 68 65 20  _IN|WO_EQ.  The 
25a0: 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61  WhereLevel.wsFla
25b0: 67 73 20 66 69 65 6c 64 20 63 61 6e 20 74 68 65  gs field can the
25c0: 6e 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  n be used as.** 
25d0: 74 68 65 20 22 6f 70 22 20 70 61 72 61 6d 65 74  the "op" paramet
25e0: 65 72 20 74 6f 20 66 69 6e 64 54 65 72 6d 20 77  er to findTerm w
25f0: 68 65 6e 20 77 65 20 61 72 65 20 72 65 73 6f 6c  hen we are resol
2600: 76 69 6e 67 20 65 71 75 61 6c 69 74 79 20 63 6f  ving equality co
2610: 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 20 49 53  nstraints..** IS
2620: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
2630: 20 77 69 6c 6c 20 74 68 65 6e 20 6e 6f 74 20 62   will then not b
2640: 65 20 75 73 65 64 20 6f 6e 20 74 68 65 20 72 69  e used on the ri
2650: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c  ght table of a l
2660: 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69  eft.** join.  Ti
2670: 63 6b 65 74 73 20 23 32 31 37 37 20 61 6e 64 20  ckets #2177 and 
2680: 23 32 31 38 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e  #2189..*/.#defin
2690: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  e WHERE_ROWID_EQ
26a0: 20 20 20 20 20 30 78 30 30 30 30 31 30 30 30 20       0x00001000 
26b0: 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f   /* rowid=EXPR o
26c0: 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29  r rowid IN (...)
26d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
26e0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 30  E_ROWID_RANGE  0
26f0: 78 30 30 30 30 32 30 30 30 20 20 2f 2a 20 72 6f  x00002000  /* ro
2700: 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20  wid<EXPR and/or 
2710: 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64  rowid>EXPR */.#d
2720: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
2730: 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 30 31 30  MN_EQ    0x00010
2740: 30 30 30 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f  000  /* x=EXPR o
2750: 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 6f 72 20  r x IN (...) or 
2760: 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64 65  x IS NULL */.#de
2770: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
2780: 4e 5f 52 41 4e 47 45 20 30 78 30 30 30 32 30 30  N_RANGE 0x000200
2790: 30 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e  00  /* x<EXPR an
27a0: 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23  d/or x>EXPR */.#
27b0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
27c0: 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 30 34  UMN_IN    0x0004
27d0: 30 30 30 30 20 20 2f 2a 20 78 20 49 4e 20 28 2e  0000  /* x IN (.
27e0: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
27f0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
2800: 20 20 30 78 30 30 30 38 30 30 30 30 20 20 2f 2a    0x00080000  /*
2810: 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f 0a 23 64   x IS NULL */.#d
2820: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45  efine WHERE_INDE
2830: 58 45 44 20 20 20 20 20 20 30 78 30 30 30 66 30  XED      0x000f0
2840: 30 30 30 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67  000  /* Anything
2850: 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
2860: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2870: 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2880: 4e 20 30 78 31 30 30 66 33 30 30 30 20 20 2f 2a  N 0x100f3000  /*
2890: 20 44 6f 65 73 20 6e 6f 74 20 64 6f 20 61 20 66   Does not do a f
28a0: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
28b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28c0: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
28d0: 30 30 66 31 30 30 30 20 20 2f 2a 20 41 62 6c 65  00f1000  /* Able
28e0: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
28f0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
2900: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f  efine WHERE_TOP_
2910: 4c 49 4d 49 54 20 20 20 20 30 78 30 30 31 30 30  LIMIT    0x00100
2920: 30 30 30 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f  000  /* x<EXPR o
2930: 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x<=EXPR constr
2940: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
2950: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
2960: 20 20 20 30 78 30 30 32 30 30 30 30 30 20 20 2f     0x00200000  /
2970: 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45  * x>EXPR or x>=E
2980: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
2990: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29a0: 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20 30 78 30  BOTH_LIMIT   0x0
29b0: 30 33 30 30 30 30 30 20 20 2f 2a 20 42 6f 74 68  0300000  /* Both
29c0: 20 78 3e 45 58 50 52 20 61 6e 64 20 78 3c 45 58   x>EXPR and x<EX
29d0: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
29e0: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20  ERE_IDX_ONLY    
29f0: 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a 20   0x00800000  /* 
2a00: 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d  Use index only -
2a10: 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23   omit table */.#
2a20: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44  define WHERE_ORD
2a30: 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30 30  ERBY      0x0100
2a40: 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74 20  0000  /* Output 
2a50: 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63  will appear in c
2a60: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a  orrect order */.
2a70: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45  #define WHERE_RE
2a80: 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32 30  VERSE      0x020
2a90: 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20 69  00000  /* Scan i
2aa0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
2ab0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2ac0: 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30 78  _UNIQUE       0x
2ad0: 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65 6c  04000000  /* Sel
2ae0: 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ects no more tha
2af0: 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65  n one row */.#de
2b00: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
2b10: 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30 30  ALTABLE 0x080000
2b20: 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74 75  00  /* Use virtu
2b30: 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73 73  al-table process
2b40: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing */.#define W
2b50: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20 20  HERE_MULTI_OR   
2b60: 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f 2a    0x10000000  /*
2b70: 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69 70   OR using multip
2b80: 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23 64  le indices */.#d
2b90: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d 50  efine WHERE_TEMP
2ba0: 5f 49 4e 44 45 58 20 20 20 30 78 32 30 30 30 30  _INDEX   0x20000
2bb0: 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e 20  000  /* Uses an 
2bc0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
2be0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
2bf0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
2c00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2c10: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
2c20: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
2c30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
2c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
2c50: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
2c60: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
2c70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c90: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
2ca0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2cb0: 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f 2a  t *pMaskSet   /*
2cc0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
2cd0: 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ble cursor numbe
2ce0: 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  rs to bitmasks *
2cf0: 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  /.){.  pWC->pPar
2d00: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
2d10: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70  WC->pMaskSet = p
2d20: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e  MaskSet;.  pWC->
2d30: 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43  nTerm = 0;.  pWC
2d40: 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  ->nSlot = ArrayS
2d50: 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63  ize(pWC->aStatic
2d60: 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57  );.  pWC->a = pW
2d70: 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70 57  C->aStatic;.  pW
2d80: 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d 0a  C->vmask = 0;.}.
2d90: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
2da0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
2db0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
2dc0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
2dd0: 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  e*);../*.** Deal
2de0: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72  locate all memor
2df0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
2e00: 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  h a WhereOrInfo 
2e10: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
2e20: 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 6e  c void whereOrIn
2e30: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
2e40: 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 66   *db, WhereOrInf
2e50: 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43 6c  o *p){.  whereCl
2e60: 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77 63  auseClear(&p->wc
2e70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2e80: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
2e90: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2ea0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
2eb0: 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65 72  ated with a Wher
2ec0: 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  eAndInfo object.
2ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ee0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65  whereAndInfoDele
2ef0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
2f00: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29  WhereAndInfo *p)
2f10: 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  {.  whereClauseC
2f20: 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20  lear(&p->wc);.  
2f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2f40: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  , p);.}../*.** D
2f50: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
2f60: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2f70: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
2f80: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2f90: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
2fa0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
2fb0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
2fc0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
2fd0: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
2fe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
2ff0: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
3000: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
3010: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
3020: 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *a;.  sqlite3 *
3030: 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  db = pWC->pParse
3040: 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57  ->db;.  for(i=pW
3050: 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57  C->nTerm-1, a=pW
3060: 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  C->a; i>=0; i--,
3070: 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   a++){.    if( a
3080: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
3090: 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20  _DYNAMIC ){.    
30a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
30b0: 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72  ete(db, a->pExpr
30c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30d0: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
30e0: 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20  RM_ORINFO ){.   
30f0: 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65     whereOrInfoDe
3100: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f  lete(db, a->u.pO
3110: 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  rInfo);.    }els
3120: 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73  e if( a->wtFlags
3130: 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20   & TERM_ANDINFO 
3140: 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e  ){.      whereAn
3150: 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20  dInfoDelete(db, 
3160: 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a  a->u.pAndInfo);.
3170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3180: 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74  pWC->a!=pWC->aSt
3190: 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  atic ){.    sqli
31a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
31b0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
31c0: 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
31d0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 65   new WhereTerm e
31e0: 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65 72  ntry to the Wher
31f0: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
3200: 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57  WC..** The new W
3210: 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20  hereTerm object 
3220: 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66  is constructed f
3230: 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77  rom Expr p and w
3240: 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20  ith wtFlags..** 
3250: 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43  The index in pWC
3260: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77  ->a[] of the new
3270: 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72 65   WhereTerm is re
3280: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
3290: 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72  s..** 0 is retur
32a0: 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 57  ned if the new W
32b0: 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e  hereTerm could n
32c0: 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65 20  ot be added due 
32d0: 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  to a memory.** a
32e0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e  llocation error.
32f0: 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
3300: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  ocation failure 
3310: 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64  will be recorded
3320: 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d   in.** the db->m
3330: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
3340: 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d   so that higher-
3350: 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20  level functions 
3360: 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a  can detect it..*
3370: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3380: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
3390: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
33a0: 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61  pWC->a[] array a
33b0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
33c0: 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61 67  ** If the wtFlag
33d0: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
33e0: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
33f0: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
3400: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
3410: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
3420: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
3430: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
3440: 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a  use object pWC..
3450: 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65 20  ** This is true 
3460: 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75  even if this rou
3470: 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c  tine fails to al
3480: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
3490: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41  reTerm..**.** WA
34a0: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
34b0: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
34c0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
34d0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
34e0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
34f0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
3500: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
3510: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
3520: 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20  fter.** calling 
3530: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53  this routine.  S
3540: 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79  uch pointers may
3550: 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   be reinitialize
3560: 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67  d by referencing
3570: 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d  .** the pWC->a[]
3580: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
3590: 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73  c int whereClaus
35a0: 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61  eInsert(WhereCla
35b0: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
35c0: 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a  p, u8 wtFlags){.
35d0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
35e0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
35f0: 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c 61   testcase( wtFla
3600: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
3610: 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30  L );  /* EV: R-0
3620: 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20  0211-15100 */.  
3630: 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d  if( pWC->nTerm>=
3640: 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20  pWC->nSlot ){.  
3650: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c    WhereTerm *pOl
3660: 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20  d = pWC->a;.    
3670: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
3680: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  C->pParse->db;. 
3690: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
36a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
36b0: 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  b, sizeof(pWC->a
36c0: 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a  [0])*pWC->nSlot*
36d0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43  2 );.    if( pWC
36e0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
36f0: 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54 45  if( wtFlags & TE
3700: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a  rDelete(db, p);.
3730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
3740: 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20  C->a = pOld;.   
3750: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3760: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57   }.    memcpy(pW
3770: 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65  C->a, pOld, size
3780: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
3790: 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  C->nTerm);.    i
37a0: 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53  f( pOld!=pWC->aS
37b0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73  tatic ){.      s
37c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
37d0: 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20   pOld);.    }.  
37e0: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73    pWC->nSlot = s
37f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
3800: 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73  ze(db, pWC->a)/s
3810: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3820: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
3830: 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57  &pWC->a[idx = pW
3840: 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70  C->nTerm++];.  p
3850: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b  Term->pExpr = p;
3860: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
3870: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70  s = wtFlags;.  p
3880: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
3890: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
38a0: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
38b0: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
38c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
38d0: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
38e0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
38f0: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
3900: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
3910: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
3920: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
3930: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
3940: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
3950: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
3960: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
3970: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3980: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
3990: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
39a0: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
39b0: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
39c0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
39d0: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
39e0: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
39f0: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
3a00: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
3a10: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
3a20: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
3a30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
3a40: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
3a50: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
3a60: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
3a70: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
3a80: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
3a90: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
3aa0: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
3ab0: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
3ac0: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
3ad0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
3ae0: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
3af0: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
3b00: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
3b10: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
3b20: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
3b30: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
3b40: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
3b50: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
3b60: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
3b70: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
3b80: 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61  y.  The slot[] a
3b90: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
3ba0: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
3bb0: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
3bc0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3be0: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
3bf0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
3c00: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
3c10: 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20  p){.  pWC->op = 
3c20: 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70 45  (u8)op;.  if( pE
3c30: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
3c40: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
3c50: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
3c60: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
3c70: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
3c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
3c90: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
3ca0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
3cb0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
3cc0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
3cd0: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
3ce0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
3cf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
3d00: 20 73 65 74 20 28 61 20 57 68 65 72 65 4d 61 73   set (a WhereMas
3d10: 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a  kSet object).*/.
3d20: 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b  #define initMask
3d30: 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50  Set(P)  memset(P
3d40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29  , 0, sizeof(*P))
3d50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3d60: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
3d70: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
3d80: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
3d90: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
3da0: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
3db0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  t..*/.static Bit
3dc0: 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68 65  mask getMask(Whe
3dd0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
3de0: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
3df0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3e00: 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e  sert( pMaskSet->
3e10: 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n<=sizeof(Bitmas
3e20: 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k)*8 );.  for(i=
3e30: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
3e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
3e50: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
3e60: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
3e70: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
3e80: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
3e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
3eb0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
3ec0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
3ed0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
3ee0: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
3ef0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
3f00: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
3f10: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
3f20: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3f30: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
3f40: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
3f50: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
3f60: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
3f70: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
3f80: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
3f90: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
3fa0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
3fb0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
3fc0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
3fd0: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70  (WhereMaskSet *p
3fe0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
3ff0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
4000: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
4010: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
4020: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
4030: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
4040: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
4050: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
4060: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
4070: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
4080: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
4090: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
40a0: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
40b0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
40c0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
40d0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
40e0: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
40f0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
4100: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
4110: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
4120: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
4130: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
4140: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65 73  voked sqlite3Res
4150: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
4160: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
4170: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
4180: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
4190: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
41a0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
41b0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
41c0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
41d0: 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  xprNames() routi
41e0: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
41f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
4200: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
4210: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
4220: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
4230: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
4240: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
4250: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
4260: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
4270: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
4280: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
4290: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
42a0: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
42b0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
42c0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
42d0: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
42e0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
42f0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4300: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
4310: 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
4320: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
4330: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
4340: 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c 20  (WhereMaskSet*, 
4350: 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63  Select*);.static
4360: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62   Bitmask exprTab
4370: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4380: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4390: 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d  Expr *p){.  Bitm
43a0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
43b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
43c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  n 0;.  if( p->op
43d0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
43e0: 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73     mask = getMas
43f0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
4400: 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75  Table);.    retu
4410: 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d  rn mask;.  }.  m
4420: 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ask = exprTableU
4430: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4440: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73  ->pRight);.  mas
4450: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4460: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
4470: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 45  >pLeft);.  if( E
4480: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4490: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
44a0: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  ){.    mask |= e
44b0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
44c0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
44d0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  >x.pSelect);.  }
44e0: 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  else{.    mask |
44f0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4500: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4510: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
4520: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
4530: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4540: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4550: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ge(WhereMaskSet 
4560: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
4570: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
4580: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
4590: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
45a0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
45b0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
45c0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
45d0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
45e0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
45f0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
4600: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
4610: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4620: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
4630: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4640: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
4650: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
4660: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
4670: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
4680: 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20   while( pS ){.  
4690: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
46a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
46b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
46c0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
46d0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
46e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
46f0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
4700: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4710: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4720: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
4730: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4740: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4750: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
4760: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
4770: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4780: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4790: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20  Having);.    pS 
47a0: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
47b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
47c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
47d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
47e0: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
47f0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
4800: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
4810: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
4820: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
4830: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
4840: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
4850: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
4860: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
4870: 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a  =", and "IN"..**
4880: 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
4890: 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d 32  ON-OF: R-59926-2
48a0: 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62 6c  6393 To be usabl
48b0: 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61 20  e by an index a 
48c0: 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a 20  term must be.** 
48d0: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
48e0: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20 63  llowing forms: c
48f0: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73 69  olumn = expressi
4900: 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70 72  on column > expr
4910: 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e  ession.** column
4920: 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63   >= expression c
4930: 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73 69  olumn < expressi
4940: 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70  on column <= exp
4950: 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72 65  ression.** expre
4960: 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65  ssion = column e
4970: 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c 75  xpression > colu
4980: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e 3d  mn expression >=
4990: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72 65   column.** expre
49a0: 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65  ssion < column e
49b0: 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c  xpression <= col
49c0: 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a  umn column IN.**
49d0: 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73   (expression-lis
49e0: 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73 75  t) column IN (su
49f0: 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20 49  bquery) column I
4a00: 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  S NULL.*/.static
4a10: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
4a20: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
4a30: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
4a40: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
4a50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
4a60: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
4a70: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
4a80: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
4a90: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
4aa0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
4ab0: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
4ac0: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
4ad0: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
4ae0: 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70  op<=TK_GE) || op
4af0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a  ==TK_ISNULL;.}..
4b00: 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f  /*.** Swap two o
4b10: 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54  bjects of type T
4b20: 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  YPE..*/.#define 
4b30: 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b  SWAP(TYPE,A,B) {
4b40: 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42  TYPE t=A; A=B; B
4b50: 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  =t;}../*.** Comm
4b60: 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  ute a comparison
4b70: 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72   operator.  Expr
4b80: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
4b90: 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20  orm "X op Y".** 
4ba0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
4bb0: 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a  to "Y op X"..**.
4bc0: 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f  ** If a collatio
4bd0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73  n sequence is as
4be0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69  sociated with ei
4bf0: 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72  ther the left or
4c00: 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f   right.** side o
4c10: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
4c20: 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73  , it remains ass
4c30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
4c40: 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72   same side after
4c50: 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74  .** the commutat
4c60: 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61  ion. So "Y colla
4c70: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20  te NOCASE op X" 
4c80: 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63  becomes .** "X c
4c90: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
4ca0: 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63   Y". This is bec
4cb0: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
4cc0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
4cd0: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
4ce0: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
4cf0: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
4d00: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4d10: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
4d20: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
4d30: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
4d40: 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43  ason the EP_ExpC
4d50: 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69  ollate flag.** i
4d60: 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a  s not commuted..
4d70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
4d80: 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65  xprCommute(Parse
4d90: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
4da0: 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78  pExpr){.  u16 ex
4db0: 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d  pRight = (pExpr-
4dc0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
4dd0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4de0: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
4df0: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
4e00: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
4e10: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
4e20: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
4e30: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
4e40: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
4e50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
4e60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
4e70: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
4e80: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
4e90: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
4ea0: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
4eb0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4ec0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4ed0: 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53  t);.  SWAP(CollS
4ee0: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
4ef0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
4f00: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
4f10: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
4f20: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
4f30: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
4f40: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
4f50: 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78  | expLeft;.  pEx
4f60: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4f70: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
4f80: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4f90: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52  pCollate) | expR
4fa0: 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70  ight;.  SWAP(Exp
4fb0: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
4fc0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
4fd0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
4fe0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
4ff0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
5000: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
5010: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
5020: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
5030: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
5040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
5050: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
5060: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
5070: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
5080: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
5090: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
50a0: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
50b0: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
50c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
50d0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
50e0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
50f0: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
5100: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
5110: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
5120: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
5130: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
5140: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
5150: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
5160: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
5170: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
5180: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
5190: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
51a0: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
51b0: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
51c0: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
51d0: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
51e0: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
51f0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5200: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
5210: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
5220: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
5230: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
5240: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
5250: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
5260: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5270: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
5280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5290: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
52a0: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
52b0: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
52c0: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
52d0: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
52e0: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
52f0: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
5300: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
5310: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
5320: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
5330: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
5340: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
5350: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
5360: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
5370: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
5380: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
5390: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
53a0: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
53b0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
53c0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
53d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
53e0: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
53f0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
5400: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
5410: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
5420: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
5430: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
5440: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
5450: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
5460: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
5470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5480: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
5490: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
54a0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
54b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
54c0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
54d0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
54e0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
54f0: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
5500: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
5510: 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u32 op,         
5520: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
5530: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
5540: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
5550: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
5560: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
5570: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
5580: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
5590: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
55a0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
55b0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
55c0: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  k;.  assert( iCu
55d0: 72 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d 20  r>=0 );.  op &= 
55e0: 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70 54  WO_ALL;.  for(pT
55f0: 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
5600: 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d  C->nTerm; k; k--
5610: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
5620: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
5630: 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20  ursor==iCur.    
5640: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
5650: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
5660: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
5670: 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  && pTerm->u.left
5680: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a  Column==iColumn.
5690: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
56a0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70  ->eOperator & op
56b0: 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
56c0: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 70 54    if( pIdx && pT
56d0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
56e0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
56f0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
5700: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
5710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
5720: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68  Coll;.        ch
5730: 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20  ar idxaff;.     
5740: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
5750: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
5760: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a  = pWC->pParse;..
5770: 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d          idxaff =
5780: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
5790: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
57a0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69  inity;.        i
57b0: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
57c0: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69  AffinityOk(pX, i
57d0: 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75  dxaff) ) continu
57e0: 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  e;..        /* F
57f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f  igure out the co
5800: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5810: 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61   required from a
5820: 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20  n index for.    
5830: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
5840: 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d  useful for optim
5850: 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ising expression
5860: 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a   pX. Store this.
5870: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
5880: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f   in variable pCo
5890: 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
58a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
58b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
58c0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
58d0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
58e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
58f0: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
5900: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ght);.        as
5910: 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70 50  sert(pColl || pP
5920: 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20  arse->nErr);..  
5930: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
5940: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
5950: 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  !=iColumn; j++){
5960: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
5970: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43  EVER(j>=pIdx->nC
5980: 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20  olumn) ) return 
5990: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
59a0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
59b0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
59c0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
59d0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20  Idx->azColl[j]) 
59e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
59f0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
5a00: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
5a10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
5a20: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5a30: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5a40: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5a50: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
5a60: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
5a70: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
5a80: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
5a90: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
5aa0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  lause.  .**.**.*
5ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5ac0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
5ad0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
5ae0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
5af0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
5b00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5b10: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
5b20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
5b30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
5b40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5b50: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
5b60: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
5b70: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
5b80: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
5b90: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
5ba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
5bb0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
5bc0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
5bd0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
5be0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
5bf0: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
5c00: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
5c10: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
5c20: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
5c30: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
5c40: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
5c50: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
5c60: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
5c70: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
5c80: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
5c90: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
5ca0: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
5cb0: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
5cc0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
5cd0: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
5ce0: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
5cf0: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
5d00: 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  b(.  Parse *pPar
5d10: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
5d20: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5d30: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
5d50: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
5d60: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
5d70: 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69    Expr **ppPrefi
5d80: 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  x,  /* Pointer t
5d90: 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72  o TK_STRING expr
5da0: 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74  ession with patt
5db0: 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  ern prefix */.  
5dc0: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
5dd0: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
5de0: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
5df0: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
5e00: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
5e10: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
5e20: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
5e30: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
5e40: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
5e50: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
5e60: 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20  har *z = 0;     
5e70: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e      /* String on
5e80: 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65   RHS of LIKE ope
5e90: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20  rator */.  Expr 
5ea0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
5eb0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61        /* Right a
5ec0: 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20  nd left size of 
5ed0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
5ef0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
5f00: 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64   List of operand
5f10: 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70  s to the LIKE op
5f20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
5f30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5f40: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68         /* One ch
5f50: 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a  aracter in z[] *
5f60: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
5f90: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
5fa0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5fb0: 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20  char wc[3];     
5fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
5fd0: 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72  ldcard character
5fe0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
5ff0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6000: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
6010: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
6020: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
6030: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b  l = 0;.  int op;
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66      /* Opcode of
6060: 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66   pRight */..  if
6070: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
6080: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
6090: 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29  pr, pnoCase, wc)
60a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
60b0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
60c0: 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28  ITE_EBCDIC.  if(
60d0: 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75   *pnoCase ) retu
60e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70  rn 0;.#endif.  p
60f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6100: 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d  pList;.  pLeft =
6110: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6120: 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d  pr;.  if( pLeft-
6130: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6140: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  | sqlite3ExprAff
6150: 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51  inity(pLeft)!=SQ
6160: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b  LITE_AFF_TEXT ){
6170: 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30  .    /* IMP: R-0
6180: 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20 6c  2065-49465 The l
6190: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
61a0: 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f   the LIKE or GLO
61b0: 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 0a  B operator must.
61c0: 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e 61      ** be the na
61d0: 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  me of an indexed
61e0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45 58   column with TEX
61f0: 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  T affinity. */. 
6200: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
6220: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20  ->iColumn!=(-1) 
6230: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49 50  ); /* Because IP
6240: 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46 5f  K never has AFF_
6250: 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68  TEXT */..  pRigh
6260: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t = pList->a[0].
6270: 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52  pExpr;.  op = pR
6280: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  ight->op;.  if( 
6290: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
62a0: 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69 67  ){.    op = pRig
62b0: 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69  ht->op2;.  }.  i
62c0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  f( op==TK_VARIAB
62d0: 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  LE ){.    Vdbe *
62e0: 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50 61  pReprepare = pPa
62f0: 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 3b  rse->pReprepare;
6300: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
6310: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b  pRight->iColumn;
6320: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
6330: 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28  te3VdbeGetValue(
6340: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
6350: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
6360: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
6370: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
6380: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
6390: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
63a0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
63b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
63c0: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
63e0: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
63f0: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 20 2f  >pVdbe, iCol); /
6400: 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
6410: 32 37 37 38 20 2a 2f 0a 20 20 20 20 61 73 73 65  2778 */.    asse
6420: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
6430: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
6440: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
6450: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
6460: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
6470: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
6480: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
6490: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
64a0: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
64b0: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
64c0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
64d0: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
64e0: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
64f0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
6500: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
6510: 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74  & 255!=(u8)z[cnt
6520: 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78 70  -1] ){.      Exp
6530: 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20 20  r *pPrefix;.    
6540: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
6550: 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63   c==wc[0] && z[c
6560: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20  nt+1]==0;.      
6570: 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65  pPrefix = sqlite
6580: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54 52  3Expr(db, TK_STR
6590: 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69  ING, z);.      i
65a0: 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50 72  f( pPrefix ) pPr
65b0: 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63  efix->u.zToken[c
65c0: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  nt] = 0;.      *
65d0: 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65 66  ppPrefix = pPref
65e0: 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ix;.      if( op
65f0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
6600: 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
6610: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6620: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6630: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
6640: 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  v, pRight->iColu
6650: 6d 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  mn); /* IMP: R-2
6660: 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20  3257-02778 */.  
6670: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
6680: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
6690: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
66a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
66b0: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
66c0: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
66d0: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
66e0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
66f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
6700: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
6710: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
6720: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
6730: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
6740: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
6750: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
6760: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
6770: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
6780: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
6790: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
67a0: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
67b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
67c0: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
67d0: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
67e0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
67f0: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
6800: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
6810: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
6820: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
6830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6840: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
6850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6860: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
6870: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
6880: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6890: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
68a0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
68b0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
68c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
68d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
68e0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
68f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6900: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6910: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
6920: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
6930: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
6940: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
6950: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6960: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
6970: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
6980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6990: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
69a0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
69b0: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
69c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
69d0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
69e0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
69f0: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
6a00: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
6a10: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
6a20: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
6a30: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
6a40: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
6a50: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
6a60: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
6a70: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
6a80: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
6a90: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
6aa0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
6ab0: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
6ac0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
6ad0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
6ae0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
6af0: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
6b00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6b10: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
6b20: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
6b30: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
6b40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6b50: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6b60: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
6b70: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
6b80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6b90: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
6ba0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6bb0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6bc0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
6bd0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
6be0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
6bf0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
6c00: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
6c10: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
6c20: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
6c30: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
6c40: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
6c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
6c60: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
6c70: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
6c80: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
6c90: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
6ca0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
6cb0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
6cc0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
6cd0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
6ce0: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
6cf0: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
6d00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6d10: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6d20: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6d30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6d40: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
6d50: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
6d60: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
6d70: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
6d80: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
6d90: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
6da0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
6db0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
6dc0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
6dd0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
6e00: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
6e10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6e20: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
6e30: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
6e40: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
6e50: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
6e60: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
6e70: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
6e80: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
6e90: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
6ea0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
6eb0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
6ec0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
6ed0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
6ee0: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
6ef0: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
6f00: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
6f10: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
6f20: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
6f30: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6f40: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
6f50: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
6f60: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
6f70: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
6f80: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
6f90: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
6fa0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
6fb0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
6fc0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
6fd0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
6fe0: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
6ff0: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
7000: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
7010: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
7020: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
7030: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
7040: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
7050: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
7060: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
7070: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
7080: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
7090: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
70a0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
70b0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
70c0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
70d0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
70e0: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
70f0: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
7100: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
7110: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
7120: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
7130: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43  D r.z=6).**.** C
7140: 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 1:.**.** If 
7150: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
7160: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43   of the form T.C
7170: 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73  =expr for some s
7180: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
7190: 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61  C.** a single ta
71a0: 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20  ble T (as shown 
71b0: 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f  in example B abo
71c0: 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ve) then create 
71d0: 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a  a new virtual.**
71e0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e   term that is an
71f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65   equivalent IN e
7200: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f  xpression.  In o
7210: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
7220: 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67  he term.** being
7230: 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a   analyzed is:.**
7240: 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70  .**      x = exp
7250: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
7260: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
7270: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61  .**.** then crea
7280: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
7290: 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a   term like this:
72a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
72b0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
72c0: 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  pr3).**.** CASE 
72d0: 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  2:.**.** If all 
72e0: 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64  subterms are ind
72f0: 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67  exable by a sing
7300: 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e  le table T, then
7310: 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57   set.**.**     W
7320: 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74  hereTerm.eOperat
7330: 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
7340: 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20  =  WO_OR.**     
7350: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
7360: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20  nfo->indexable  
7370: 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e  |=  the cursor n
7380: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
7390: 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72  T.**.** A subter
73a0: 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22  m is "indexable"
73b0: 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68 65   if it is of the
73c0: 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f   form.** "T.C <o
73d0: 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65  p> <expr>" where
73e0: 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e   C is any column
73f0: 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20   of table T and 
7400: 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  .** <op> is one 
7410: 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d  of "=", "<", "<=
7420: 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49  ", ">", ">=", "I
7430: 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22  S NULL", or "IN"
7440: 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69  ..** A subterm i
7450: 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65  s also indexable
7460: 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44   if it is an AND
7470: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
7480: 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20 61  ** subsubterms a
7490: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77  t least one of w
74a0: 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c  hich is indexabl
74b0: 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e  e.  Indexable AN
74c0: 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68  D .** subterms h
74d0: 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72 61  ave their eOpera
74e0: 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e  tor set to WO_AN
74f0: 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a  D and they have.
7500: 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65  ** u.pAndInfo se
7510: 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c  t to a dynamical
7520: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  ly allocated Whe
7530: 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74  reAndTerm object
7540: 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f  ..**.** From ano
7550: 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69  ther point of vi
7560: 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20  ew, "indexable" 
7570: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
7580: 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20  ubterm could.** 
7590: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75  potentially be u
75a0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
75b0: 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69  x if an appropri
75c0: 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  ate index exists
75d0: 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73  ..** This analys
75e0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73  is does not cons
75f0: 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  ider whether or 
7600: 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65 78  not the index ex
7610: 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73  ists; that.** is
7620: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62   something the b
7630: 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69  estIndex() routi
7640: 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e  ne will determin
7650: 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69  e.  This analysi
7660: 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20  s.** only looks 
7670: 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74 65  at whether subte
7680: 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  rms appropriate 
7690: 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69  for indexing exi
76a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78  st..**.** All ex
76b0: 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68  amples A through
76c0: 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74   E above all sat
76d0: 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42 75  isfy case 2.  Bu
76e0: 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61  t if a term.** a
76f0: 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20 63  lso statisfies c
7700: 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20 42  ase 1 (such as B
7710: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
7720: 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c  he optimizer wil
7730: 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66  l.** always pref
7740: 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e  er case 1, so in
7750: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70 72   that case we pr
7760: 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65 20  etend that case 
7770: 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69  2 is not.** sati
7780: 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  sfied..**.** It 
7790: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
77a0: 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20  e that multiple 
77b0: 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78  tables are index
77c0: 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  able.  For examp
77d0: 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65  le,.** (E) above
77e0: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e   is indexable on
77f0: 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e   tables P, Q, an
7800: 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  d R..**.** Terms
7810: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
7820: 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64 61  se 2 are candida
7830: 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62  tes for lookup b
7840: 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72  y using.** separ
7850: 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66  ate indices to f
7860: 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65  ind rowids for e
7870: 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20  ach subterm and 
7880: 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  composing.** the
7890: 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f   union of all ro
78a0: 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77  wids using a Row
78b0: 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
78c0: 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20  s is similar.** 
78d0: 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63  to "bitmap indic
78e0: 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74  es" in other dat
78f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a  abase engines..*
7900: 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a  *.** OTHERWISE:.
7910: 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
7920: 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65   case 1 nor case
7930: 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c   2 apply, then l
7940: 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61 74  eave the eOperat
7950: 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72  or set to.** zer
7960: 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69 73  o.  This term is
7970: 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20   not useful for 
7980: 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  search..*/.stati
7990: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
79a0: 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c  zeOrTerm(.  SrcL
79b0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
79c0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
79d0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
79e0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
79f0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63          /* the c
7a00: 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c  omplete WHERE cl
7a10: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
7a20: 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  xTerm           
7a30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
7a40: 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62  the OR-term to b
7a50: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
7a60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7a70: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20   = pWC->pParse; 
7a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7a90: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7aa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7ab0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
7ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
7ad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7ae0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7af0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
7b00: 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a  [idxTerm];    /*
7b10: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
7b20: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78  analyzed */.  Ex
7b30: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
7b40: 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20  m->pExpr;       
7b50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
7b60: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74  ression of the t
7b70: 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  erm */.  WhereMa
7b80: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20  skSet *pMaskSet 
7b90: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
7ba0: 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61   /* Table use ma
7bb0: 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  sks */.  int i; 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7bf0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
7c00: 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20  se *pOrWc;      
7c10: 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70   /* Breakup of p
7c20: 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72  Term into subter
7c30: 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ms */.  WhereTer
7c40: 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20  m *pOrTerm;     
7c50: 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20    /* A Sub-term 
7c60: 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63  within the pOrWc
7c70: 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66   */.  WhereOrInf
7c80: 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20  o *pOrInfo;     
7c90: 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e  /* Additional in
7ca0: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69  formation associ
7cb0: 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d 20  ated with pTerm 
7cc0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e  */.  Bitmask chn
7cd0: 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f  gToIN;         /
7ce0: 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69  * Tables that mi
7cf0: 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65  ght satisfy case
7d00: 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20   1 */.  Bitmask 
7d10: 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20  indexable;      
7d20: 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
7d30: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20   are indexable, 
7d40: 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65 20  satisfying case 
7d50: 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 */..  /*.  ** 
7d60: 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61  Break the OR cla
7d70: 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70  use into its sep
7d80: 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20  arate subterms. 
7d90: 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61 72   The subterms ar
7da0: 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e  e.  ** stored in
7db0: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
7dc0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
7dd0: 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20 57  ing within the W
7de0: 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20  hereOrInfo.  ** 
7df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 61  object that is a
7e00: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
7e10: 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73  riginal OR claus
7e20: 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61  e term..  */.  a
7e30: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77  ssert( (pTerm->w
7e40: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44  tFlags & (TERM_D
7e50: 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e  YNAMIC|TERM_ORIN
7e60: 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29  FO|TERM_ANDINFO)
7e70: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
7e80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7e90: 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75  OR );.  pTerm->u
7ea0: 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e  .pOrInfo = pOrIn
7eb0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
7ec0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7ed0: 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a  eof(*pOrInfo));.
7ee0: 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30    if( pOrInfo==0
7ef0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65   ) return;.  pTe
7f00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
7f10: 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f  ERM_ORINFO;.  pO
7f20: 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e  rWc = &pOrInfo->
7f30: 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  wc;.  whereClaus
7f40: 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43  eInit(pOrWc, pWC
7f50: 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53  ->pParse, pMaskS
7f60: 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  et);.  whereSpli
7f70: 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20  t(pOrWc, pExpr, 
7f80: 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e  TK_OR);.  exprAn
7f90: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
7fa0: 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  OrWc);.  if( db-
7fb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
7fc0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
7fd0: 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d  ( pOrWc->nTerm>=
7fe0: 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  2 );..  /*.  ** 
7ff0: 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74 20  Compute the set 
8000: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d  of tables that m
8010: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
8020: 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a  es 1 or 2..  */.
8030: 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28    indexable = ~(
8040: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e  Bitmask)0;.  chn
8050: 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e 76  gToIN = ~(pWC->v
8060: 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d 70  mask);.  for(i=p
8070: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
8080: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
8090: 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62   i>=0 && indexab
80a0: 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  le; i--, pOrTerm
80b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f  ++){.    if( (pO
80c0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
80d0: 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30   & WO_SINGLE)==0
80e0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41   ){.      WhereA
80f0: 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f  ndInfo *pAndInfo
8100: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8110: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8120: 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  or==0 );.      a
8130: 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d  ssert( (pOrTerm-
8140: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
8150: 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52  _ANDINFO|TERM_OR
8160: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20  INFO))==0 );.   
8170: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
8180: 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20  .      pAndInfo 
8190: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
81a0: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
81b0: 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20  *pAndInfo));.   
81c0: 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20     if( pAndInfo 
81d0: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
81e0: 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a  Clause *pAndWC;.
81f0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
8200: 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20  m *pAndTerm;.   
8210: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
8220: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
8230: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  0;.        pOrTe
8240: 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d  rm->u.pAndInfo =
8250: 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20   pAndInfo;.     
8260: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
8270: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49  ags |= TERM_ANDI
8280: 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  NFO;.        pOr
8290: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
82a0: 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = WO_AND;.      
82b0: 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64    pAndWC = &pAnd
82c0: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
82d0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
82e0: 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70  t(pAndWC, pWC->p
82f0: 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29  Parse, pMaskSet)
8300: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53  ;.        whereS
8310: 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72  plit(pAndWC, pOr
8320: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f  Term->pExpr, TK_
8330: 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78  AND);.        ex
8340: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
8350: 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20  c, pAndWC);.    
8360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
8370: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8380: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
8390: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
83a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
83b0: 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70  (j=0, pAndTerm=p
83c0: 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64  AndWC->a; j<pAnd
83d0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
83e0: 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  pAndTerm++){.   
83f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8400: 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72   pAndTerm->pExpr
8410: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
8420: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41  if( allowedOp(pA
8430: 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f  ndTerm->pExpr->o
8440: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
8450: 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b      b |= getMask
8460: 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  (pMaskSet, pAndT
8470: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
8480: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8490: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
84a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
84b0: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
84c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
84d0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
84e0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
84f0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
8500: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
8510: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
8520: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
8530: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
8540: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
8550: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
8560: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
8570: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
8580: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
8590: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
85a0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
85b0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
85c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
85d0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b   TERM_VIRTUAL ){
85e0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
85f0: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f  rm *pOther = &pO
8600: 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e  rWc->a[pOrTerm->
8610: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
8620: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70    b |= getMask(p
8630: 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d  MaskSet, pOther-
8640: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8650: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65      }.      inde
8660: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
8670: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65    if( pOrTerm->e
8680: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20  Operator!=WO_EQ 
8690: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54  ){.        chngT
86a0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  oIN = 0;.      }
86b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
86c0: 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20  ngToIN &= b;.   
86d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
86e0: 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64    /*.  ** Record
86f0: 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c   the set of tabl
8700: 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  es that satisfy 
8710: 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74  case 2.  The set
8720: 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65   might be.  ** e
8730: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  mpty..  */.  pOr
8740: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
8750: 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70  = indexable;.  p
8760: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8770: 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f  = indexable==0 ?
8780: 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f   0 : WO_OR;..  /
8790: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
87a0: 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74  holds a set of t
87b0: 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68  ables that *migh
87c0: 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20  t* satisfy case 
87d0: 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20  1.  But.  ** we 
87e0: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
87f0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b  additional check
8800: 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61  ing to see if ca
8810: 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a  se 1 really.  **
8820: 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20   is satisfied.. 
8830: 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   **.  ** chngToI
8840: 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68  N will hold eith
8850: 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69  er 0, 1, or 2 bi
8860: 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63  ts.  The 0-bit c
8870: 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74  ase means.  ** t
8880: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
8890: 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74  possibility of t
88a0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20  ransforming the 
88b0: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  OR clause into a
88c0: 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74  n.  ** IN operat
88d0: 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  or because one o
88e0: 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20  r more terms in 
88f0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f  the OR clause co
8900: 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74  ntain.  ** somet
8910: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
8920: 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69  == on a column i
8930: 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62  n the single tab
8940: 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20  le.  The 1-bit. 
8950: 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74   ** case means t
8960: 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f  hat every term o
8970: 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  f the OR clause 
8980: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  is of the form. 
8990: 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d   ** "table.colum
89a0: 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65  n=expr" for some
89b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20   single table.  
89c0: 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74  The one bit that
89d0: 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c   is set.  ** wil
89e0: 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  l correspond to 
89f0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  the common table
8a00: 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64  .  We still need
8a10: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b   to check to mak
8a20: 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20  e.  ** sure the 
8a30: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75  same column is u
8a40: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  sed on all terms
8a50: 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73  .  The 2-bit cas
8a60: 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  e is when.  ** t
8a70: 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65  he all terms are
8a80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61   of the form "ta
8a90: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c  ble1.column=tabl
8aa0: 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a  e2.column".  It.
8ab0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f    ** might be po
8ac0: 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61  ssible to form a
8ad0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
8ae0: 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31  th either table1
8af0: 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20  .column.  ** or 
8b00: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73  table2.column as
8b10: 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68   the LHS if eith
8b20: 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  er is common to 
8b30: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20  every term of.  
8b40: 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ** the OR clause
8b50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
8b60: 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74   that terms of t
8b70: 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63  he form "table.c
8b80: 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c  olumn1=table.col
8b90: 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20  umn2" (the.  ** 
8ba0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f  same table on bo
8bb0: 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20  th sizes of the 
8bc0: 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ==) cannot be op
8bd0: 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  timized..  */.  
8be0: 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a  if( chngToIN ){.
8bf0: 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67      int okToChng
8c00: 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ToIN = 0;     /*
8c10: 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e   True if the con
8c20: 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73  version to IN is
8c30: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e   valid */.    in
8c40: 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  t iColumn = -1; 
8c50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
8c60: 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f  n index on lhs o
8c70: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
8c80: 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72  .    int iCursor
8c90: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8ca0: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63  * Table cursor c
8cb0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72  ommon to all ter
8cc0: 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  ms */.    int j 
8cd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8ce0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8cf0: 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ter */..    /* S
8d00: 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c  earch for a tabl
8d10: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61  e and column tha
8d20: 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65  t appears on one
8d30: 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
8d40: 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65   ** other of the
8d50: 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20   == operator in 
8d60: 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20  every subterm.  
8d70: 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63  That table and c
8d80: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c  olumn.    ** wil
8d90: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
8da0: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
8db0: 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67  lumn.  There mig
8dc0: 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20  ht not be any.  
8dd0: 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20    ** such table 
8de0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74  and column.  Set
8df0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66   okToChngToIN if
8e00: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
8e10: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64  table.    ** and
8e20: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64   column is found
8e30: 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43   but leave okToC
8e40: 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66  hngToIN false if
8e50: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
8e60: 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  */.    for(j=0; 
8e70: 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67  j<2 && !okToChng
8e80: 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ToIN; j++){.    
8e90: 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57    pOrTerm = pOrW
8ea0: 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  c->a;.      for(
8eb0: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
8ec0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
8ed0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
8ee0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
8ef0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
8f00: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  EQ );.        pO
8f10: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8f20: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
8f30: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
8f40: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
8f50: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
8f60: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
8f70: 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61  the 2-bit case a
8f80: 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65  nd we are on the
8f90: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
8fa0: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  n and.          
8fb0: 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  ** current term 
8fc0: 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  is from the firs
8fd0: 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f  t iteration.  So
8fe0: 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e   skip this term.
8ff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
9000: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
9010: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9020: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9030: 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49      if( (chngToI
9040: 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  N & getMask(pMas
9050: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
9060: 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29  eftCursor))==0 )
9070: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9080: 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65  his term must be
9090: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e   of the form t1.
90a0: 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32  a==t2.b where t2
90b0: 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20   is in the.     
90c0: 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e       ** chngToIN
90d0: 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e   set but t1 is n
90e0: 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77  ot.  This term w
90f0: 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72  ill be either pr
9100: 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20 20  eceeded.        
9110: 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20    ** or follwed 
9120: 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63  by an inverted c
9130: 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29  opy (t2.b==t1.a)
9140: 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  .  Skip this ter
9150: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
9160: 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76 65  and use its inve
9170: 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  rsion. */.      
9180: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9190: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
91a0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a   TERM_COPIED );.
91b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
91c0: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
91d0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
91e0: 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  UAL );.         
91f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9200: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
9210: 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49  M_COPIED|TERM_VI
9220: 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20  RTUAL) );.      
9230: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9250: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72  iColumn = pOrTer
9260: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
9270: 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72  .        iCursor
9280: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74   = pOrTerm->left
9290: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
92a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
92b0: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a       if( i<0 ){.
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61          /* No ca
92d0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f  ndidate table+co
92e0: 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20  lumn was found. 
92f0: 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
9300: 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ccur.        ** 
9310: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
9320: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
9330: 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20     assert( j==1 
9340: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9350: 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68  t( (chngToIN&(ch
9360: 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b  ngToIN-1))==0 );
9370: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9380: 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61   chngToIN==getMa
9390: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  sk(pMaskSet, iCu
93a0: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
93c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
93d0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
93e0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
93f0: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
9400: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
9410: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
9420: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
9430: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
9440: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
9450: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
9460: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
9470: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
9480: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
9490: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
94a0: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
94b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
94c0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
94d0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
94e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
94f0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
9500: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r!=iCursor ){.  
9510: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
9520: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
9530: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
9550: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
9560: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
9570: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
9580: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
9590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
95a0: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
95b0: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  ffRight;.       
95c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67     /* If the rig
95d0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
95e0: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
95f0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
9600: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
9610: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e  of both right an
9620: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73  d left sides mus
9630: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e  t be such that n
9640: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  o type.         
9650: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   ** conversions 
9660: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
9670: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63  the right.  (Tic
9680: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20  ket #2249).     
9690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
96a0: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
96b0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
96c0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
96d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
96e0: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71      affLeft = sq
96f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9700: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
9710: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9720: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74      if( affRight
9730: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21  !=0 && affRight!
9740: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20  =affLeft ){.    
9750: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
9760: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
9770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9780: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
9790: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
97a0: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  OR_OK;.         
97b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
97c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
97d0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
97e0: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  , okToChngToIN i
97f0: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e  s true if origin
9800: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69  al pTerm satisfi
9810: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31  es.    ** case 1
9820: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9830: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
9840: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68   virtual term th
9850: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54  at is .    ** pT
9860: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  erm converted in
9870: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
9880: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
9890: 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35 31   EV: R-00211-151
98a0: 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  00.    */.    if
98b0: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29  ( okToChngToIN )
98c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
98d0: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
98e0: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75  * A transient du
98f0: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
9900: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
9910: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
9920: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66     /* The RHS of
9930: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
9940: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
9950: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20  pLeft = 0;      
9960: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74   /* The LHS of t
9970: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
9980: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  /.      Expr *pN
9990: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew;            /
99a0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49  * The complete I
99b0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  N operator */.. 
99c0: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63       for(i=pOrWc
99d0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
99e0: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
99f0: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  0; i--, pOrTerm+
9a00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9a10: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67  (pOrTerm->wtFlag
9a20: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
9a30: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9a40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9a50: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9a60: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9a70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9a80: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
9a90: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
9aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9ab0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
9ac0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
9ad0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
9ae0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9af0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
9b00: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9b10: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9b20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9b30: 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  d(pWC->pParse, p
9b40: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
9b50: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
9b60: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
9b70: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
9b80: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
9b90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
9ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9bb0: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
9bc0: 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
9bd0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9be0: 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  e, TK_IN, pDup, 
9bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
9c00: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
9c10: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
9c20: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
9c30: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
9c40: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
9c50: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9c60: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
9c70: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
9c80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
9c90: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
9ca0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
9cb0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
9cc0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
9cd0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
9ce0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
9cf0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
9d00: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  w==0 );.        
9d10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
9d20: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
9d30: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
9d40: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
9d50: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
9d60: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
9d70: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
9d80: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
9d90: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
9da0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9db0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9dc0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
9dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
9de0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
9df0: 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63 61 73 65  O_NOOP;  /* case
9e00: 20 31 20 74 72 75 6d 70 73 20 63 61 73 65 20 32   1 trumps case 2
9e10: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   */.    }.  }.}.
9e20: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9e30: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
9e40: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54  ZATION && !SQLIT
9e50: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
9e60: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  */.../*.** The i
9e70: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
9e80: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
9e90: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
9ea0: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
9eb0: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
9ec0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
9ed0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
9ee0: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
9ef0: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
9f00: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
9f10: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
9f20: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
9f30: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
9f40: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
9f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9f60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
9f70: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
9f80: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
9f90: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
9fa0: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
9fb0: 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20   <expr>"..**.** 
9fc0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9fd0: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9fe0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
9ff0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
a000: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74  re.** columns, t
a010: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
a020: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
a030: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
a040: 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65  ew virtual.** te
a050: 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
a060: 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64  Y <op> X" is add
a070: 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ed to the WHERE 
a080: 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e  clause and.** an
a090: 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c  alyzed separatel
a0a0: 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  y.  The original
a0b0: 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20   term is marked 
a0c0: 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44  with TERM_COPIED
a0d0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20  .** and the new 
a0e0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
a0f0: 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ith TERM_DYNAMIC
a100: 20 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70   (because it's p
a110: 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  Expr.** needs to
a120: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74   be freed with t
a130: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20  he WhereClause) 
a140: 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  and TERM_VIRTUAL
a150: 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20   (because it.** 
a160: 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f  is a commuted co
a170: 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65  py of a prior te
a180: 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e  rm.)  The origin
a190: 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69  al term has nChi
a1a0: 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ld=1.** and the 
a1b0: 63 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65  copy has idxPare
a1c0: 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  nt set to the in
a1d0: 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69  dex of the origi
a1e0: 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  nal term..*/.sta
a1f0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
a200: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
a210: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
a220: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
a230: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
a240: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
a250: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
a260: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a270: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
a280: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a290: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
a2a0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
a2b0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a2c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
a2d0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
a2e0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a2f0: 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  /.  WhereMaskSet
a300: 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20   *pMaskSet;     
a310: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74       /* Set of t
a320: 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73  able index masks
a330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
a340: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
a350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
a360: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
a370: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74  nalyzed */.  Bit
a380: 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b  mask prereqLeft;
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3a0: 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f   Prerequesites o
a3b0: 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65  f the pExpr->pLe
a3c0: 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ft */.  Bitmask 
a3d0: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
a3f0: 65 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78  equesites of pEx
a400: 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  pr */.  Bitmask 
a410: 65 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20  extraRight = 0; 
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
a430: 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f  a dependencies o
a440: 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20  n LEFT JOIN */. 
a450: 20 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30   Expr *pStr1 = 0
a460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a470: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
a480: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
a490: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  /.  int isComple
a4a0: 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  te = 0;         
a4b0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
a4c0: 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69  IKE/GLOB ends wi
a4d0: 74 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  th wildcard */. 
a4e0: 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b   int noCase = 0;
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64    /* LIKE/GLOB d
a510: 69 73 74 69 6e 67 75 69 73 68 65 73 20 63 61 73  istinguishes cas
a520: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  e */.  int op;  
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c          /* Top-l
a550: 65 76 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20  evel operator.  
a560: 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50  pExpr->op */.  P
a570: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
a580: 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  WC->pParse;     
a590: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a5a0: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
a5b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a5c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
a5d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a5e0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
a5f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
a600: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a610: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
a620: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73  idxTerm];.  pMas
a630: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
a640: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
a650: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
a660: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
a670: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
a680: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
a690: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
a6a0: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
a6b0: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
a6c0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
a6d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
a6e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a6f0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
a700: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a710: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
a720: 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54  ht = exprSelectT
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 78 2e 70 53 65  et, pExpr->x.pSe
a750: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
a760: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
a770: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
a780: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
a790: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a7a0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
a7b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a7c0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
a7d0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a7e0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ight = 0;.  }els
a7f0: 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  e{.    pTerm->pr
a800: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a810: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a820: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
a830: 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65  ht);.  }.  prere
a840: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
a850: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a860: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78  pExpr);.  if( Ex
a870: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a880: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
a890: 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b  ) ){.    Bitmask
a8a0: 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61   x = getMask(pMa
a8b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
a8c0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
a8d0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
a8e0: 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67   x;.    extraRig
a8f0: 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e  ht = x-1;  /* ON
a900: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61   clause terms ma
a910: 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  y not be used wi
a920: 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20  th an index.    
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61     ** on left ta
a950: 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
a960: 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  IN.  Ticket #301
a970: 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d  5 */.  }.  pTerm
a980: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
a990: 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d  ereqAll;.  pTerm
a9a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d  ->leftCursor = -
a9b0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  1;.  pTerm->iPar
a9c0: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  ent = -1;.  pTer
a9d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30  m->eOperator = 0
a9e0: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
a9f0: 70 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d  p(op) && (pTerm-
aa00: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
aa10: 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b  rereqLeft)==0 ){
aa20: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
aa30: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
aa40: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
aa50: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
aa60: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  t;.    if( pLeft
aa70: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
aa80: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ){.      pTerm->
aa90: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
aaa0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
aab0: 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43    pTerm->u.leftC
aac0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
aad0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
aae0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
aaf0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
ab00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ab10: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
ab20: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
ab30: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
ab40: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
ab50: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
ab60: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
ab70: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
ab80: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
ab90: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
aba0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
abb0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
abc0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
abd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
abe0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
abf0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
ac00: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
ac10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
ac20: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
ac30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
ac40: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
ac50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
ac60: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
ac70: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
ac80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ac90: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
aca0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
acb0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
acc0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
acd0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
ace0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
acf0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
ad00: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ad10: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
ad20: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
ad30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ad40: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
ad50: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
ad60: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
ad70: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
ad80: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
ad90: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
ada0: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
adb0: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
adc0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
add0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
ade0: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  w->u.leftColumn 
adf0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
ae00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ae10: 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20  ( (prereqLeft | 
ae20: 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70  extraRight) != p
ae30: 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20  rereqLeft );.   
ae40: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52     pNew->prereqR
ae50: 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66  ight = prereqLef
ae60: 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a  t | extraRight;.
ae70: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
ae80: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
ae90: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
aea0: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
aeb0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
aec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
aed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aee0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
aef0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
af00: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
af10: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
af20: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
af30: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
af40: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
af50: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
af60: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
af70: 74 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ts.  For example
af80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
af90: 20 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44   a BETWEEN b AND
afa0: 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20   c.  **.  ** is 
afb0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a  converted into:.
afc0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28    **.  **      (
afd0: 61 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20  a BETWEEN b AND 
afe0: 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e  c) AND (a>=b) AN
aff0: 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20  D (a<=c).  **.  
b000: 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74  ** The two new t
b010: 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f  erms are added o
b020: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
b030: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
b040: 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20  bject..  ** The 
b050: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 22 64  new terms are "d
b060: 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20  ynamic" and are 
b070: 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20  children of the 
b080: 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e  original BETWEEN
b090: 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61  .  ** term.  Tha
b0a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20  t means that if 
b0b0: 74 68 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d  the BETWEEN term
b0c0: 20 69 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63   is coded, the c
b0d0: 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a  hildren are.  **
b0e0: 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69   skipped.  Or, i
b0f0: 66 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  f the children a
b100: 72 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20  re satisfied by 
b110: 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72  an index, the or
b120: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57  iginal.  ** BETW
b130: 45 45 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70  EEN term is skip
b140: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
b150: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b160: 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57  TK_BETWEEN && pW
b170: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  C->op==TK_AND ){
b180: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
b190: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b1a0: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
b1b0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b1c0: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
b1d0: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
b1e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
b1f0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
b210: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
b220: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
b230: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b240: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
b250: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
b260: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b270: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69  pr(pParse, ops[i
b280: 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b2b0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
b2c0: 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
b2f0: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
b300: 5d 2e 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b  ].pExpr, 0), 0);
b310: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
b320: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b330: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
b340: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
b350: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
b360: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
b370: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
b380: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
b390: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
b3a0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
b3b0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b3c0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b3d0: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
b3e0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
b3f0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
b400: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
b410: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
b420: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
b430: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
b440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b450: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
b460: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
b470: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b480: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
b490: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
b4a0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
b4b0: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
b4c0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
b4d0: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
b4e0: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
b4f0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
b500: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
b510: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
b520: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
b530: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
b540: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
b550: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
b560: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
b570: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b580: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
b590: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
b5a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b5b0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
b5c0: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
b5d0: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
b5e0: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
b5f0: 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
b600: 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
b610: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
b620: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
b630: 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
b640: 20 27 61 62 63 25 27 22 20 69 73 20 63 68 61 6e   'abc%'" is chan
b650: 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
b660: 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
b670: 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62 63 27          x>='abc'
b680: 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
b690: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 0a 20   x LIKE 'abc%'. 
b6a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
b6b0: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
b6c0: 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
b6d0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
b6e0: 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
b6f0: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
b700: 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a  ition "abd"..  *
b710: 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d  /.  if( pWC->op=
b720: 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69  =TK_AND .   && i
b730: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72  sLikeOrGlob(pPar
b740: 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72  se, pExpr, &pStr
b750: 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20  1, &isComplete, 
b760: 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20  &noCase).  ){.  
b770: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
b780: 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c       /* LHS of L
b790: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
b7a0: 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
b7b0: 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43  Str2;       /* C
b7c0: 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52  opy of pStr1 - R
b7d0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b7e0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b7f0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b  Expr *pNewExpr1;
b800: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b810: 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64  xpr2;.    int id
b820: 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69  xNew1;.    int i
b830: 64 78 4e 65 77 32 3b 0a 20 20 20 20 43 6f 6c 6c  dxNew2;.    Coll
b840: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
b850: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
b860: 65 6e 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 0a  ence to use */..
b870: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b880: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b8a0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b8b0: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b8c0: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b8d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b8e0: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b8f0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b900: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b910: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b920: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b930: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b940: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b950: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b960: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b970: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b980: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b990: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b9a0: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b9b0: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b9c0: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b9d0: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b9e0: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b9f0: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
ba00: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
ba10: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
ba20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
ba30: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
ba40: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
ba50: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
ba60: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
ba70: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
ba80: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
ba90: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
baa0: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
bab0: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
bac0: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
bad0: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
bae0: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
baf0: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
bb00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
bb10: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
bb20: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 2f 2a 20  plete = 0;   /* 
bb30: 45 56 3a 20 52 2d 36 34 33 33 39 2d 30 38 32 30  EV: R-64339-0820
bb40: 37 20 2a 2f 0a 0a 0a 20 20 20 20 20 20 20 20 63  7 */...        c
bb50: 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   = sqlite3UpperT
bb60: 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20  oLower[c];.     
bb70: 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63   }.      *pC = c
bb80: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + 1;.    }.    
bb90: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
bba0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
bbb0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 6e 6f 43 61  QLITE_UTF8, noCa
bbc0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
bbd0: 22 42 49 4e 41 52 59 22 2c 30 29 3b 0a 20 20 20  "BINARY",0);.   
bbe0: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
bbf0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bc00: 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20 20 20 20  , TK_GE, .      
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bc20: 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c  qlite3ExprSetCol
bc30: 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  l(sqlite3ExprDup
bc40: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43  (db,pLeft,0), pC
bc50: 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  oll),.          
bc60: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
bc70: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
bc80: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
bc90: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bca0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
bcb0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
bcc0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bcd0: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
bce0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bcf0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
bd00: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
bd10: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bd20: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20  pParse, TK_LT,. 
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
bd50: 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45 78  etColl(sqlite3Ex
bd60: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30  prDup(db,pLeft,0
bd70: 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20 20  ), pColl),.     
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
bda0: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
bdb0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
bdc0: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
bdd0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
bde0: 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
bdf0: 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d 30 20  ase( idxNew2==0 
be00: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
be10: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
be20: 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72  xNew2);.    pTer
be30: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
be40: 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73  erm];.    if( is
be50: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
be60: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31    pWC->a[idxNew1
be70: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
be80: 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  erm;.      pWC->
be90: 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65  a[idxNew2].iPare
bea0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
beb0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
bec0: 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 2;.    }.  }
bed0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bee0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
bef0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
bf00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf10: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
bf20: 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43  /* Add a WO_MATC
bf30: 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d  H auxiliary term
bf40: 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69   to the constrai
bf50: 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20  nt set if the.  
bf60: 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65  ** current expre
bf70: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
bf80: 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41  form:  column MA
bf90: 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54  TCH expr..  ** T
bfa0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
bfb0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78  is used by the x
bfc0: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
bfd0: 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61  s of.  ** virtua
bfe0: 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e  l tables.  The n
bff0: 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69  ative query opti
c000: 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61  mizer does not a
c010: 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64  ttempt.  ** to d
c020: 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20  o anything with 
c030: 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e  MATCH functions.
c040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61  .  */.  if( isMa
c050: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70  tchOfColumn(pExp
c060: 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  r) ){.    int id
c070: 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a  xNew;.    Expr *
c080: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
c090: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c0a0: 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74  NewTerm;.    Bit
c0b0: 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d  mask prereqColum
c0c0: 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a  n, prereqExpr;..
c0d0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
c0e0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
c0f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65  ].pExpr;.    pLe
c100: 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ft = pExpr->x.pL
c110: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
c120: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
c130: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
c140: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
c150: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
c160: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
c170: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
c180: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
c190: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
c1a0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
c1b0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
c1c0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
c1d0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
c1e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c1f0: 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20  _MATCH, .       
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
c220: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69  3ExprDup(db, pRi
c230: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  ght, 0), 0);.   
c240: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
c250: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
c260: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
c270: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
c280: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
c290: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
c2a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
c2b0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c2c0: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e  dxNew];.      pN
c2d0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  ewTerm->prereqRi
c2e0: 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72  ght = prereqExpr
c2f0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c300: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
c310: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
c320: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e      pNewTerm->u.
c330: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
c340: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
c350: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70     pNewTerm->eOp
c360: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43  erator = WO_MATC
c370: 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  H;.      pNewTer
c380: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  m->iParent = idx
c390: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72  Term;.      pTer
c3a0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
c3b0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  erm];.      pTer
c3c0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
c3d0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
c3e0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
c3f0: 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  ED;.      pNewTe
c400: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
c410: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
c420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c430: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c440: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
c450: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
c460: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20  _ENABLE_STAT2.  
c470: 2f 2a 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73  /* When sqlite_s
c480: 74 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20 64  tat2 histogram d
c490: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
c4a0: 20 61 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20   an operator of 
c4b0: 74 68 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78  the.  ** form "x
c4c0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61   IS NOT NULL" ca
c4d0: 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65  n sometimes be e
c4e0: 76 61 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66  valuated more ef
c4f0: 66 69 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61  ficiently.  ** a
c500: 73 20 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20  s "x>NULL" if x 
c510: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
c520: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  R PRIMARY KEY.  
c530: 53 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20  So construct a. 
c540: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d   ** virtual term
c550: 20 6f 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20   of that form.. 
c560: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
c570: 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  at the virtual t
c580: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67  erm must be tagg
c590: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55  ed with TERM_VNU
c5a0: 4c 4c 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54  LL.  This.  ** T
c5b0: 45 52 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69  ERM_VNULL tag wi
c5c0: 6c 6c 20 73 75 70 70 72 65 73 73 20 74 68 65 20  ll suppress the 
c5d0: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
c5e0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
c5f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70    ** of the loop
c600: 2e 20 20 57 69 74 68 6f 75 74 20 74 68 65 20 54  .  Without the T
c610: 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20  ERM_VNULL flag, 
c620: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
c630: 63 6b 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73  ck at.  ** the s
c640: 74 61 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tart of the loop
c650: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e   will prevent an
c660: 79 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62  y results from b
c670: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20  eing returned.. 
c680: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
c690: 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op==TK_NOTNULL 
c6a0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
c6b0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
c6c0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
c6d0: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
c6e0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
c6f0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
c700: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
c710: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
c720: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
c730: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c740: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
c770: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
c780: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c7a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c7b0: 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  e, TK_NULL, 0, 0
c7c0: 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69  , 0), 0);..    i
c7d0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
c7e0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
c7f0: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
c820: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c830: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
c840: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
c850: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65  ew==0 );.    pNe
c860: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
c870: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 70 4e 65  idxNew];.    pNe
c880: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
c890: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
c8a0: 65 3b 0a 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  e;.    pNewTerm-
c8b0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
c8c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
c8d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
c8e0: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
c8f0: 0a 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69  .    pNewTerm->i
c900: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
c910: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c920: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c930: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
c940: 64 20 3d 20 31 3b 0a 20 20 20 20 70 54 65 72 6d  d = 1;.    pTerm
c950: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c960: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 70 4e  M_COPIED;.    pN
c970: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
c980: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
c990: 71 41 6c 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  qAll;.  }.#endif
c9a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
c9b0: 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a  E_STAT2 */..  /*
c9c0: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c9d0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c9e0: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c9f0: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
ca00: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
ca10: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
ca20: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
ca30: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
ca40: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
ca50: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
ca60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
ca70: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
ca80: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
ca90: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
caa0: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
cab0: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
cac0: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
cad0: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
cae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
caf0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
cb00: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
cb10: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cb20: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
cb30: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
cb40: 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  list */.  WhereM
cb50: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
cb60: 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  ,   /* Mapping f
cb70: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
cb80: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
cb90: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
cba0: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
cbb0: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
cbc0: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
cbd0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
cbe0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
cbf0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
cc00: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
cc10: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
cc20: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
cc30: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
cc40: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
cc50: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
cc60: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
cc70: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
cc80: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
cc90: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
cca0: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
ccb0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
ccc0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ccd0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cce0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ccf0: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
cd00: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
cd10: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
cd20: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
cd30: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
cd40: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
cd50: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
cd60: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
cd70: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
cd80: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
cd90: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
cda0: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
cdb0: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
cdc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cdd0: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
cde0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
cdf0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
ce00: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
ce10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce20: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
ce30: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
ce40: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
ce50: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
ce60: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
ce70: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
ce80: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
ce90: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
cea0: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
ceb0: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
cec0: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
ced0: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
cee0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
cef0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
cf00: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
cf10: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
cf20: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
cf30: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
cf40: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
cf50: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
cf60: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
cf70: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
cf80: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
cf90: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
cfa0: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
cfb0: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
cfc0: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
cfd0: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
cfe0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
cff0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
d000: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
d010: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
d020: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
d030: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
d040: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
d050: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d060: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
d070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
d080: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
d090: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d0a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d0b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
d0c0: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
d0d0: 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70 70 69 6e  skSet, /* Mappin
d0e0: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63 75 72  g from table cur
d0f0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62  sor numbers to b
d100: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e 64 65  itmaps */.  Inde
d110: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d120: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
d130: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20   we are testing 
d140: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d160: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
d170: 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  r the table to b
d180: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
d190: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d1a0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
d1b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
d1c0: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20    int nEqCol,   
d1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d1e0: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
d1f0: 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e  umns with == con
d200: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
d210: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
d220: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
d230: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
d240: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
d250: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d270: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
d280: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
d290: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
d2a0: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
d2b0: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
d2c0: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
d2d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d300: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
d310: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
d320: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
d330: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
d340: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
d350: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
d360: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d370: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
d380: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
d390: 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
d3a0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
d3b0: 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
d3c0: 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70  .  /* Argument p
d3d0: 49 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20  Idx must either 
d3e0: 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c  point to a 'real
d3f0: 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74  ' named index st
d400: 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f  ructure, .  ** o
d410: 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  r an index struc
d420: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ture allocated o
d430: 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62  n the stack by b
d440: 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20  estBtreeIndex() 
d450: 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  to.  ** represen
d460: 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65  t the rowid inde
d470: 78 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  x that is part o
d480: 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20  f every table.  
d490: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
d4a0: 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64  x->zName || (pId
d4b0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26  x->nColumn==1 &&
d4c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d4d0: 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a  0]==-1) );..  /*
d4e0: 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20   Match terms of 
d4f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d500: 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  use against colu
d510: 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  mns of.  ** the 
d520: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
d530: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63   Note that indic
d540: 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43  es have pIdx->nC
d550: 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f  olumn regular co
d560: 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20  lumns plus.  ** 
d570: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  one additional c
d580: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  olumn containing
d590: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65   the rowid.  The
d5a0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20   rowid column.  
d5b0: 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ** of the index 
d5c0: 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20  is also allowed 
d5d0: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
d5e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d5f0: 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
d600: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
d610: 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
d620: 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49  j<nTerm && i<=pI
d630: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
d640: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
d650: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
d660: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
d670: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
d680: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
d690: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
d6a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
d6b0: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
d6c0: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
d6d0: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
d6e0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
d6f0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  term */.    int 
d700: 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f  iColumn;       /
d710: 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  * The i-th colum
d720: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
d730: 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f   -1 for rowid */
d740: 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72  .    int iSortOr
d750: 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72  der;    /* 1 for
d760: 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43   DESC, 0 for ASC
d770: 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64   on the i-th ind
d780: 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63  ex term */.    c
d790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
d7a0: 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ; /* Name of the
d7b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d7c0: 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64  nce for i-th ind
d7d0: 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  ex term */..    
d7e0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
d7f0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
d800: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
d810: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
d820: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
d830: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
d840: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
d850: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
d860: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
d870: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
d880: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
d890: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
d8a0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  use */.      bre
d8b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
d8c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d8d0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d8e0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
d8f0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
d900: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
d910: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
d920: 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d    if( pIdx->zNam
d930: 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  e && i<pIdx->nCo
d940: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
d950: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
d960: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
d970: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
d980: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
d990: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
d9a0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
d9b0: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
d9c0: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
d9d0: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
d9e0: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
d9f0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
da00: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
da10: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
da20: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
da30: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
da40: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
da50: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
da60: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
da70: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
da80: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
da90: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
daa0: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
dab0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
dac0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
dad0: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
dae0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
daf0: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
db00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
db10: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
db20: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
db30: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
db40: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
db50: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
db60: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
db70: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
db80: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
db90: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
dba0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
dbb0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
dbc0: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( i==pIdx->nCol
dbd0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  umn ){.        /
dbe0: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69  * Index column i
dbf0: 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   is the rowid.  
dc00: 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20  All other terms 
dc10: 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20  match. */.      
dc20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
dc30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
dc40: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c   If an index col
dc50: 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74  umn fails to mat
dc60: 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f  ch and is not co
dc70: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a  nstrained by ==.
dc80: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
dc90: 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  the index cannot
dca0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
dcb0: 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74  ER BY constraint
dcc0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
dcd0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
dce0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dcf0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
dd00: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20  SortOrder!=0 || 
dd10: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20  iColumn==-1 );. 
dd20: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
dd30: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c  ->sortOrder==0 |
dd40: 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  | pTerm->sortOrd
dd50: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
dd60: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
dd70: 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72  =0 || iSortOrder
dd80: 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53  ==1 );.    termS
dd90: 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74  ortOrder = iSort
dda0: 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73  Order ^ pTerm->s
ddb0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66  ortOrder;.    if
ddc0: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
ddd0: 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74      if( termSort
dde0: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
ddf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
de00: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
de10: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
de20: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
de30: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
de40: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
de50: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
de60: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
de70: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
de80: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
de90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dea0: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72   sortOrder = ter
deb0: 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  mSortOrder;.    
dec0: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70  }.    j++;.    p
ded0: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Term++;.    if( 
dee0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65  iColumn<0 && !re
def0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
df00: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
df10: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
df20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
df30: 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  the indexed colu
df40: 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  mn is the primar
df50: 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74  y key and everyt
df60: 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20  hing matches.   
df70: 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64     ** so far and
df80: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44   none of the ORD
df90: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74  ER BY terms to t
dfa0: 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e  he right referen
dfb0: 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  ce other.      *
dfc0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
dfd0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72  join, then we ar
dfe0: 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74  e assured that t
dff0: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
e000: 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74  used .      ** t
e010: 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74  o sort because t
e020: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
e030: 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20  s unique and so 
e040: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65  none of the othe
e050: 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  r.      ** colum
e060: 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79  ns will make any
e070: 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20   difference.    
e080: 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e    */.      j = n
e090: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
e0a0: 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74  .  *pbRev = sort
e0b0: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20  Order!=0;.  if( 
e0c0: 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  j>=nTerm ){.    
e0d0: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
e0e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
e0f0: 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20  use are covered 
e100: 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f  by this index so
e110: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64  .    ** this ind
e120: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ex can be used f
e130: 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  or sorting. */. 
e140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
e150: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
e160: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
e170: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
e180: 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65  n.      && !refe
e190: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
e1a0: 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73  s(pOrderBy, pMas
e1b0: 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29  kSet, j, base) )
e1c0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
e1d0: 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  ms of this index
e1e0: 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66   match some pref
e1f0: 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ix of the ORDER 
e200: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
e210: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
e220: 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20  s UNIQUE and no 
e230: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69  terms on the tai
e240: 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  l of the ORDER B
e250: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
e260: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20  reference other 
e270: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
e280: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c  .  If this is al
e290: 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20  l true then.    
e2a0: 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  ** the order by 
e2b0: 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66  clause is superf
e2c0: 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65  luous. */.    re
e2d0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
e2e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e2f0: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
e300: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
e310: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
e320: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
e330: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
e340: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
e350: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
e360: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
e370: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
e380: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
e390: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
e3a0: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
e3b0: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
e3c0: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
e3d0: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
e3e0: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
e3f0: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
e400: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
e410: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
e420: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
e430: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
e440: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
e450: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
e460: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
e470: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
e480: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
e490: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
e4a0: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
e4b0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
e4c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
e4d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
e4e0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
e4f0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
e500: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
e510: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
e520: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
e530: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
e540: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
e550: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
e560: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
e570: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
e580: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e590: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
e5a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
e5b0: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
e5c0: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
e5d0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e5e0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e5f0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e600: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e610: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e620: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e630: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e640: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e650: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
e660: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
e670: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
e680: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
e690: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
e6a0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
e6b0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
e6c0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
e6d0: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
e6e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e6f0: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
e700: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
e710: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
e720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e730: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
e740: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e750: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
e760: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
e770: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e780: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
e790: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
e7a0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
e7b0: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
e7c0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
e7d0: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e7e0: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e7f0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e800: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e810: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e820: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e830: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e840: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e850: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e860: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
e870: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
e880: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e890: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e8a0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
e8b0: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
e8c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
e8d0: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
e8e0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
e8f0: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
e900: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
e910: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
e920: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
e930: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
e940: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
e950: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
e960: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
e970: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
e980: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
e990: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e9a0: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
e9b0: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
e9c0: 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
e9d0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
e9e0: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
e9f0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
ea00: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
ea10: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65  ../* .** Require
ea20: 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49 6e  d because bestIn
ea30: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20  dex() is called 
ea40: 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49  by bestOrClauseI
ea50: 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69  ndex() .*/.stati
ea60: 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78  c void bestIndex
ea70: 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68  (.    Parse*, Wh
ea80: 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75  ereClause*, stru
ea90: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a  ct SrcList_item*
eaa0: 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42  ,.    Bitmask, B
eab0: 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74  itmask, ExprList
eac0: 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a  *, WhereCost*);.
ead0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
eae0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
eaf0: 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67  find an scanning
eb00: 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63   strategy that c
eb10: 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74  an be used .** t
eb20: 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f  o optimize an 'O
eb30: 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  R' expression th
eb40: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
eb50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a  WHERE clause. .*
eb60: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
eb70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
eb80: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
eb90: 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68  pSrc may be eith
eba0: 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20  er a.** regular 
ebb0: 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20  B-Tree table or 
ebc0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ebd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ebe0: 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
ebf0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
ec00: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
ec10: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
ec20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
ec30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
ec40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ec50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ec60: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
ec70: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a  _item *pSrc,  /*
ec80: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
ec90: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
eca0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
ecb0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
ecc0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
ecd0: 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ors not availabl
ece0: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  e for indexing *
ecf0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56  /.  Bitmask notV
ed00: 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  alid,           
ed10: 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61  /* Cursors not a
ed20: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79  vailable for any
ed30: 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78   purpose */.  Ex
ed40: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ed50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
ed60: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ed70: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
ed80: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
ed90: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
eda0: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
edb0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
edc0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
edd0: 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e  ATION.  const in
ede0: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
edf0: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
ee00: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
ee10: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
ee20: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  sed */.  const B
ee30: 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d  itmask maskSrc =
ee40: 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
ee50: 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20  askSet, iCur);  
ee60: 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70  /* Bitmask for p
ee70: 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  Src */.  WhereTe
ee80: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e  rm * const pWCEn
ee90: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
eea0: 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20  >nTerm];        
eeb0: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
eec0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
eed0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
eee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
eef0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
ef00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
ef10: 2f 0a 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c  /..  /* No OR-cl
ef20: 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ause optimizatio
ef30: 6e 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65  n allowed if the
ef40: 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
ef50: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
ef60: 65 73 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64  es.  ** are used
ef70: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ef80: 6e 6f 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53  notIndexed || pS
ef90: 72 63 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b  rc->pIndex!=0 ){
efa0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
efb0: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68  ..  /* Search th
efc0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
efd0: 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c  erms for a usabl
efe0: 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f  e WO_OR term. */
eff0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
f000: 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
f010: 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
f020: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
f030: 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20  rator==WO_OR .  
f040: 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70     && ((pTerm->p
f050: 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b  rereqAll & ~mask
f060: 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29  Src) & notReady)
f070: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
f080: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
f090: 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53  ndexable & maskS
f0a0: 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  rc)!=0 .    ){. 
f0b0: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
f0c0: 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
f0d0: 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
f0e0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
f0f0: 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
f100: 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
f110: 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
f120: 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
f130: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
f140: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
f150: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
f160: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f        double rTo
f170: 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64  tal = 0;.      d
f180: 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a  ouble nRow = 0;.
f190: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73        Bitmask us
f1a0: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66  ed = 0;..      f
f1b0: 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
f1c0: 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
f1d0: 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
f1e0: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
f1f0: 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a  Cost sTermCost;.
f200: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
f210: 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69  CE(("... Multi-i
f220: 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20  ndex OR testing 
f230: 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25  for term %d of %
f240: 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20  d....\n", .     
f250: 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20       (pOrTerm - 
f260: 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72  pOrWC->a), (pTer
f270: 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20  m - pWC->a).    
f280: 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20      ));.        
f290: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
f2a0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29  erator==WO_AND )
f2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72  {.          Wher
f2c0: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20  eClause *pAndWC 
f2d0: 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41  = &pOrTerm->u.pA
f2e0: 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  ndInfo->wc;.    
f2f0: 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28        bestIndex(
f300: 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20  pParse, pAndWC, 
f310: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
f320: 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54  notValid, 0, &sT
f330: 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ermCost);.      
f340: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
f350: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
f360: 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
f370: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74     WhereClause t
f380: 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  empWC;.         
f390: 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d   tempWC.pParse =
f3a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
f3b0: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
f3c0: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
f3d0: 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20  MaskSet;.       
f3e0: 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
f3f0: 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
f400: 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
f410: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74  erm;.          t
f420: 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
f430: 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
f440: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65  ndex(pParse, &te
f450: 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52  mpWC, pSrc, notR
f460: 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20  eady, notValid, 
f470: 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a  0, &sTermCost);.
f480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f490: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
f4a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
f4b0: 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73       rTotal += s
f4c0: 54 65 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a  TermCost.rCost;.
f4d0: 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20          nRow += 
f4e0: 73 54 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e  sTermCost.plan.n
f4f0: 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65  Row;.        use
f500: 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75  d |= sTermCost.u
f510: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sed;.        if(
f520: 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e   rTotal>=pCost->
f530: 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rCost ) break;. 
f540: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
f550: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
f560: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
f570: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 63   increase the sc
f580: 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75  an cost to accou
f590: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  nt .      ** for
f5a0: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
f5b0: 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20   sort. */.      
f5c0: 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  if( pOrderBy!=0 
f5d0: 29 7b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ){.        WHERE
f5e0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
f5f0: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52  ing increases OR
f600: 20 63 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e   cost %.9g to %.
f610: 39 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  9g\n",.         
f620: 20 20 20 20 20 20 20 20 20 20 20 72 54 6f 74 61             rTota
f630: 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65  l, rTotal+nRow*e
f640: 73 74 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20  stLog(nRow)));. 
f650: 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d         rTotal +=
f660: 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f   nRow*estLog(nRo
f670: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  w);.      }..   
f680: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73     /* If the cos
f690: 74 20 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73  t of scanning us
f6a0: 69 6e 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d  ing this OR term
f6b0: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
f6c0: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65  n is.      ** le
f6d0: 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  ss than the curr
f6e0: 65 6e 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20  ent cost stored 
f6f0: 69 6e 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63  in pCost, replac
f700: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  e the contents. 
f710: 20 20 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74       ** of pCost
f720: 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  . */.      WHERE
f730: 54 52 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74  TRACE(("... mult
f740: 69 2d 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d  i-index OR cost=
f750: 25 2e 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e  %.9g nrow=%.9g\n
f760: 22 2c 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29  ", rTotal, nRow)
f770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f  );.      if( rTo
f780: 74 61 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74  tal<pCost->rCost
f790: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73   ){.        pCos
f7a0: 74 2d 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61  t->rCost = rTota
f7b0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  l;.        pCost
f7c0: 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20  ->used = used;. 
f7d0: 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
f7e0: 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  an.nRow = nRow;.
f7f0: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
f800: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
f810: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ags;.        pCo
f820: 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  st->plan.u.pTerm
f830: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
f840: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f850: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f860: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
f870: 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  N */.}..#ifndef 
f880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f890: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
f8a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f8b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f8c0: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
f8d0: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
f8e0: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
f8f0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
f900: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
f910: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
f920: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
f930: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
f940: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
f950: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
f960: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f980: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
f990: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
f9a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
f9b0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
f9c0: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
f9d0: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
f9e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
f9f0: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
fa00: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
fa10: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
fa20: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
fa30: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
fa40: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
fa50: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
fa60: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
fa70: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
fa80: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72  rator!=WO_EQ ) r
fa90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
faa0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
fab0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
fac0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fad0: 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
fae0: 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
faf0: 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
fb00: 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
fb10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
fb20: 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
fb30: 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
fb40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
fb50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
fb60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fb70: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
fb80: 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
fb90: 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70  plan for pSrc sp
fba0: 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74  ecified in pCost
fbb0: 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   is a full table
fbc0: 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64   scan.** and ind
fbd0: 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20  exing is allows 
fbe0: 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (if there is no 
fbf0: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
fc00: 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f  se) and it.** po
fc10: 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72  ssible to constr
fc20: 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20  uct a transient 
fc30: 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64  index that would
fc40: 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a   perform better.
fc50: 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74  ** than a full t
fc60: 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77  able scan even w
fc70: 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  hen the cost of 
fc80: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
fc90: 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b   index.** is tak
fca0: 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c  en into account,
fcb0: 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20   then alter the 
fcc0: 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73  query plan to us
fcd0: 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65  e the.** transie
fce0: 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  nt index..*/.sta
fcf0: 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75 74  tic void bestAut
fd00: 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
fd10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd30: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
fd40: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
fd50: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
fd60: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
fd70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
fd80: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
fd90: 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
fda0: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
fdb0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
fdc0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
fdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
fde0: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
fdf0: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
fe00: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  able */.  WhereC
fe10: 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
fe20: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
fe30: 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
fe40: 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e  */.){.  double n
fe50: 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20  TableRow;       
fe60: 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74      /* Rows in t
fe70: 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a  he input table *
fe80: 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b  /.  double logN;
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77  /* log(nTableRow
feb0: 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  ) */.  double co
fec0: 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20  stTempIdx;      
fed0: 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20     /* per-query 
fee0: 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e  cost of the tran
fef0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
ff00: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
ff10: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
ff20: 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
ff30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ff40: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
ff50: 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
ff60: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
ff70: 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65  ->a[] */.  Table
ff80: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
ff90: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
ffa0: 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64  tht might be ind
ffb0: 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 28  exed */..  if( (
ffc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
ffd0: 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
ffe0: 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ndex)==0 ){.    
fff0: 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
10000 69 63 65 73 20 61 72 65 20 64 69 73 61 62 6c 65  ices are disable
10010 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f  d at run-time */
10020 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10030 0a 20 20 69 66 28 20 28 70 43 6f 73 74 2d 3e 70  .  if( (pCost->p
10040 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
10050 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
10060 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  )!=0 ){.    /* W
10070 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 73  e already have s
10080 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64 65  ome kind of inde
10090 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68 69  x in use for thi
100a0 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  s query. */.    
100b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
100c0 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78  ( pSrc->notIndex
100d0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
100e0 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
100f0 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20 74  use appears in t
10100 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20 72  he SQL. */.    r
10110 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
10120 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51  sert( pParse->nQ
10130 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75  ueryLoop >= (dou
10140 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c  ble)1 );.  pTabl
10150 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
10160 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54    nTableRow = pT
10170 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  able->nRowEst;. 
10180 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e   logN = estLog(n
10190 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73  TableRow);.  cos
101a0 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67  tTempIdx = 2*log
101b0 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61  N*(nTableRow/pPa
101c0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
101d0 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74  + 1);.  if( cost
101e0 54 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e  TempIdx>=pCost->
101f0 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
10200 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
10210 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
10220 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
10230 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
10240 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
10250 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
10260 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
10270 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
10280 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
10290 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
102a0 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
102b0 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
102c0 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
102d0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
102e0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
102f0 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
10300 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
10310 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
10320 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
10330 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65  RACE(("auto-inde
10340 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66  x reduces cost f
10350 72 6f 6d 20 25 2e 32 66 20 74 6f 20 25 2e 32 66  rom %.2f to %.2f
10360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10370 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
10380 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49  rCost, costTempI
10390 64 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  dx));.      pCos
103a0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  t->rCost = costT
103b0 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43  empIdx;.      pC
103c0 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
103d0 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20   logN + 1;.     
103e0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
103f0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d  lags = WHERE_TEM
10400 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70  P_INDEX;.      p
10410 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65  Cost->used = pTe
10420 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
10430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10440 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
10450 23 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74  # define bestAut
10460 6f 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c  omaticIndex(A,B,
10470 43 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70  C,D,E)  /* no-op
10480 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
10490 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
104a0 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
104b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
104c0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
104d0 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
104e0 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
104f0 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
10500 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
10510 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
10520 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
10530 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
10540 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
10550 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
10560 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
10570 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
10580 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
10590 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
105a0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
105b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
105c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
105d0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
105e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
105f0 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
10600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10610 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10620 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10630 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
10640 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10650 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
10660 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
10670 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
10680 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
10690 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
106a0 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
106b0 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
106c0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
106d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
106e0 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
106f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
10700 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
10710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10720 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
10730 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
10740 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
10750 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
10760 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
10770 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
10780 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
10790 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
107a0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
107b0 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
107c0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
107d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
107e0 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
107f0 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
10800 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10820 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
10830 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
10840 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
10850 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
10860 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
10870 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
10880 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10890 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 73  n */.  int regIs
108a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
108b0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
108c0 65 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 61  et by initializa
108d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
108e0 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
108f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10900 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
10910 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
10920 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
10930 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
10940 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
10950 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
10960 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
10970 79 69 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yinfo;          
10980 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
10990 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  on for the index
109a0 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20 61 64 64   */   .  int add
109b0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
109c0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
109d0 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f  he index fill lo
109e0 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  op */.  int regR
109f0 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
10a00 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10a10 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78  holding an index
10a20 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
10a30 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10a40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
10a50 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  mn counter */.  
10a60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10a90 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20   int mxBitCol;  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ab0 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69  Maximum column i
10ac0 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  n pSrc->colUsed 
10ad0 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
10ae0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
10af0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
10b00 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63  quence to on a c
10b10 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  olumn */.  Bitma
10b20 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20 20  sk idxCols;     
10b30 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
10b40 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
10b50 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f   for indexing */
10b60 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
10b70 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 2f  Cols;          /
10b80 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64 69  * Bitmap of addi
10b90 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a  tional columns *
10ba0 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  /..  /* Generate
10bb0 20 63 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76   code to skip ov
10bc0 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
10bd0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  and initializati
10be0 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74  on of the.  ** t
10bf0 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f  ransient index o
10c00 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  n 2nd and subseq
10c10 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20  uent iterations 
10c20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a  of the loop. */.
10c30 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
10c40 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
10c50 21 3d 30 20 29 3b 0a 20 20 72 65 67 49 73 49 6e  !=0 );.  regIsIn
10c60 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
10c70 4d 65 6d 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  Mem;.  addrInit 
10c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10c90 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
10ca0 67 49 73 49 6e 69 74 29 3b 0a 20 20 73 71 6c 69  gIsInit);.  sqli
10cb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10cc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10cd0 72 65 67 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f  regIsInit);..  /
10ce0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10cf0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
10d00 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
10d10 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
10d20 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
10d30 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
10d40 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
10d50 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a  .  nColumn = 0;.
10d60 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
10d70 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
10d80 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
10d90 54 65 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73  Term];.  idxCols
10da0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
10db0 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
10dc0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
10dd0 7b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61  {.    if( termCa
10de0 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72  nDriveIndex(pTer
10df0 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  m, pSrc, notRead
10e00 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  y) ){.      int 
10e10 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e  iCol = pTerm->u.
10e20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
10e30 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20    Bitmask cMask 
10e40 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28  = iCol>=BMS ? ((
10e50 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
10e60 2d 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29  -1) : ((Bitmask)
10e70 31 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1)<<iCol;.      
10e80 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
10e90 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
10ea0 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
10eb0 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1 );.      if( 
10ec0 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
10ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10ee0 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  nColumn++;.     
10ef0 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
10f00 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
10f10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
10f20 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
10f30 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
10f40 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f   = nColumn;..  /
10f50 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
10f60 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
10f70 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
10f80 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
10f90 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
10fa0 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
10fb0 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
10fc0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
10fd0 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
10fe0 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
10ff0 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
11000 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
11010 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
11020 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
11030 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
11040 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
11050 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
11060 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
11070 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
11080 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
11090 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
110a0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
110b0 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
110c0 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
110d0 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
110e0 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
110f0 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
11100 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
11110 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
11120 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
11130 28 7e 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42  (~idxCols | (((B
11140 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
11150 31 29 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c  1)));.  mxBitCol
11160 20 3d 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   = (pTable->nCol
11170 20 3e 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53   >= BMS-1) ? BMS
11180 2d 31 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  -1 : pTable->nCo
11190 6c 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  l;.  testcase( p
111a0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
111b0 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
111c0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
111d0 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
111e0 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
111f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
11200 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74  traCols & (((Bit
11210 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43  mask)1)<<i) ) nC
11220 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69  olumn++;.  }.  i
11230 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
11240 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
11250 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
11260 20 20 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61    nColumn += pTa
11270 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
11280 2b 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65  + 1;.  }.  pLeve
11290 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
112a0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
112b0 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
112c0 4e 4c 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20  NLY | WO_EQ;..  
112d0 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
112e0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
112f0 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 69   describe this i
11300 6e 64 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20  ndex */.  nByte 
11310 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b  = sizeof(Index);
11320 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
11330 75 6d 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b  umn*sizeof(int);
11340 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
11350 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74  Column */.  nByt
11360 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a  e += nColumn*siz
11370 65 6f 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a  eof(char*);   /*
11380 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f   Index.azColl */
11390 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
113a0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  umn;            
113b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
113c0 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49  ortOrder */.  pI
113d0 64 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  dx = sqlite3DbMa
113e0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
113f0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
11400 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
11410 75 72 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  urn;.  pLevel->p
11420 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
11430 78 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  x;.  pIdx->azCol
11440 6c 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64  l = (char**)&pId
11450 78 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69  x[1];.  pIdx->ai
11460 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
11470 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  pIdx->azColl[nCo
11480 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn];.  pIdx->a
11490 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
114a0 29 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  )&pIdx->aiColumn
114b0 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64  [nColumn];.  pId
114c0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f  x->zName = "auto
114d0 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d  -index";.  pIdx-
114e0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75  >nColumn = nColu
114f0 6d 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  mn;.  pIdx->pTab
11500 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
11510 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
11520 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
11530 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
11540 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
11550 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
11560 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
11570 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
11580 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
11590 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
115a0 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
115b0 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
115c0 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42   iCol>=BMS ? ((B
115d0 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
115e0 31 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31  1) : ((Bitmask)1
115f0 29 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  )<<iCol;.      i
11600 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
11610 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
11620 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
11630 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
11640 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
11650 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
11660 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
11670 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
11680 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
11690 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
116a0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
116b0 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
116c0 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
116d0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
116e0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f  >azColl[n] = pCo
116f0 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
11700 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     n++;.      }.
11710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
11720 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 65 76  rt( (u32)n==pLev
11730 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a  el->plan.nEq );.
11740 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69  .  /* Add additi
11750 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
11760 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
11770 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
11780 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65  into.  ** a cove
11790 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
117a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
117b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
117c0 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 28  f( extraCols & (
117d0 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 29  ((Bitmask)1)<<i)
117e0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
117f0 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
11800 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
11810 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
11820 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
11830 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
11840 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28  rc->colUsed & ((
11850 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d  (Bitmask)1)<<(BM
11860 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 66 6f 72  S-1)) ){.    for
11870 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
11880 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
11890 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
118a0 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
118b0 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
118c0 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
118d0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
118e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d    }.  assert( n=
118f0 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f  =nColumn );..  /
11900 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
11910 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
11920 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73 71 6c    pKeyinfo = sql
11930 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
11940 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
11950 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
11960 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
11970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11980 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op4(v, OP_OpenAu
11990 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
119a0 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d  >iIdxCur, nColum
119b0 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  n+1, 0,.        
119c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
119d0 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f  r*)pKeyinfo, P4_
119e0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
119f0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11a00 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
11a10 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
11a20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
11a30 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
11a40 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
11a50 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
11a60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11a70 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
11a80 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65  ->iTabCur);.  re
11a90 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
11aa0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11ab0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
11ac0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
11ad0 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
11ae0 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
11af0 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73  gRecord, 1);.  s
11b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b10 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
11b20 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
11b30 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
11b40 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11b50 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
11b60 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
11b70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b80 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
11b90 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
11ba0 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71  addrTop+1);.  sq
11bb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11bc0 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
11bd0 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
11be0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11bf0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11c00 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
11c10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11c20 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
11c30 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  ;.  .  /* Jump h
11c40 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e  ere when skippin
11c50 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
11c60 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
11c70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11c80 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65   addrInit);.}.#e
11c90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11ca0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
11cb0 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  DEX */..#ifndef 
11cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11cd0 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
11ce0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
11cf0 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
11d00 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
11d10 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
11d20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
11d30 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
11d40 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
11d50 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
11d60 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
11d70 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
11d80 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
11d90 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
11da0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
11db0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
11dc0 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
11dd0 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
11de0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
11df0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
11e00 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
11e10 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
11e20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11e30 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
11e40 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
11e50 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
11e60 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
11e70 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
11e80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11e90 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
11ea0 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
11eb0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11ec0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11ed0 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
11ee0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
11ef0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
11f00 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
11f10 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
11f20 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
11f30 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
11f40 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
11f50 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
11f60 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
11f70 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
11f80 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
11f90 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
11fa0 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
11fb0 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
11fc0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
11fd0 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
11fe0 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
11ff0 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
12000 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
12010 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
12020 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
12030 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
12040 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
12050 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
12060 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12070 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
12080 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
12090 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
120a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
120b0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
120c0 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
120d0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
120e0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
120f0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
12100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
12110 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
12120 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
12130 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
12140 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
12150 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
12160 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
12170 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
12180 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
12190 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
121a0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
121b0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
121c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
121d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
121e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
121f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12200 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12210 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
12220 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
12230 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12240 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
12250 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
12260 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
12270 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
12280 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
12290 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  ( i==pOrderBy->n
122a0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Expr ){.      nO
122b0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
122c0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a  y->nExpr;.    }.
122d0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
122e0 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
122f0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
12300 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
12310 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
12320 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
12330 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
12340 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
12370 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
12380 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
12390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
123b0 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
123c0 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
123d0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
123e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
123f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12400 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
12410 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65  ;.    /* (double
12420 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
12430 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
12440 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
12450 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12460 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
12470 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
12480 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
12490 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
124a0 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
124b0 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
124c0 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
124d0 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
124e0 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
124f0 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
12500 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
12510 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
12520 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
12530 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
12540 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
12550 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
12560 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
12570 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12580 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
12590 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
125a0 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
125b0 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
125c0 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
125d0 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
125e0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
125f0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12600 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
12610 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
12620 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
12630 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
12640 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
12650 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
12660 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
12670 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
12680 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
12690 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
126a0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
126b0 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
126c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
126d0 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
126e0 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
126f0 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
12700 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
12710 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
12720 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
12730 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12740 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
12790 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
127a0 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
127b0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
127c0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
127d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
127e0 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
127f0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
12800 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
12810 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
12820 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
12830 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
12840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12850 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
12860 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
12870 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
12880 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
12890 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
128a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
128b0 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
128c0 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
128d0 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
128e0 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
128f0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
12900 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
12910 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
12920 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
12930 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
12940 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a  Operator;.    /*
12950 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
12960 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
12970 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
12980 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
12990 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
129a0 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
129b0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
129c0 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
129d0 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
129e0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
129f0 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
12a00 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
12a10 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
12a20 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12a30 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
12a40 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
12a50 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
12a60 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
12a70 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
12a80 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12a90 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
12aa0 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
12ab0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12ac0 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
12ad0 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
12ae0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12af0 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
12b00 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
12b10 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
12b20 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
12b30 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
12b40 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
12b50 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54  r & (WO_EQ|WO_LT
12b60 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
12b70 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
12b80 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
12b90 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
12ba0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
12bb0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
12bc0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
12bd0 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
12be0 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
12bf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
12c00 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
12c10 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
12c20 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
12c30 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
12c40 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
12c50 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
12c60 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
12c70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12c80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
12c90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
12ca0 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
12cb0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
12cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12cd0 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
12ce0 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
12cf0 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
12d00 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
12d10 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12d20 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  fo pointer passe
12d30 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75  d.** as the argu
12d40 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
12d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12d60 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
12d70 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
12d80 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
12d90 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
12da0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
12db0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
12dc0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
12dd0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
12de0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
12df0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
12e00 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
12e10 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
12e20 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
12e30 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
12e40 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
12e50 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12e60 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
12e70 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
12e80 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
12e90 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
12ea0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
12eb0 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
12ec0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12ed0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
12ee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12ef0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
12f00 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
12f10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
12f20 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
12f30 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
12f40 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
12f50 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
12f60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48 45 52   int rc;..  WHER
12f70 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
12f80 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
12f90 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
12fa0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
12fb0 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
12fc0 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
12fd0 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
12fe0 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
12ff0 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28  TPUTS(p);..  if(
13000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13010 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
13020 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
13030 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
13040 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
13050 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13060 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
13070 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13090 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
130a0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
130b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
130c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
130d0 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
130e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
130f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
13100 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
13110 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
13120 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
13130 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
13140 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
13150 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
13160 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
13170 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
13180 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
13190 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
131a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
131b0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
131c0 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
131d0 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
131e0 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
131f0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
13200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13210 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
13220 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rr;.}.../*.** Co
13230 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
13240 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
13250 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
13260 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
13270 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
13280 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
13290 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
132a0 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
132b0 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
132c0 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
132d0 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
132e0 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
132f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13300 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
13310 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
13320 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
13330 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
13340 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
13350 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
13360 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
13370 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
13380 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
13390 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
133a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
133b0 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
133c0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
133d0 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
133e0 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
133f0 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
13400 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
13410 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
13420 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
13430 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
13440 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
13450 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
13460 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
13470 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
13480 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
13490 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
134a0 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
134b0 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
134c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
134d0 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
134e0 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
134f0 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
13500 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
13510 76 6f 69 64 20 62 65 73 74 56 69 72 74 75 61 6c  void bestVirtual
13520 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
13530 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13550 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
13560 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
13570 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
13580 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
13590 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
135a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
135b0 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a  m *pSrc,      /*
135c0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
135d0 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
135e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
135f0 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
13600 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
13610 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
13620 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20  lable for index 
13630 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
13640 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
13650 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
13660 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61 6e  not valid for an
13670 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
13680 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
13690 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y,             /
136a0 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
136b0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
136c0 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20 20 20  Cost *pCost,    
136d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
136e0 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
136f0 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  plan */.  sqlite
13700 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
13710 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64  pIdxInfo  /* Ind
13720 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ex information p
13730 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e  assed to xBestIn
13740 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  dex */.){.  Tabl
13750 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  e *pTab = pSrc->
13760 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pTab;.  sqlite3_
13770 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
13780 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
13790 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
137a0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
137b0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
137c0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
137d0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
137e0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
137f0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
13800 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   j;.  int nOrder
13810 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43 6f  By;.  double rCo
13820 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
13830 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20 69  ure wsFlags is i
13840 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f  nitialized to so
13850 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f  me sane value. O
13860 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
13870 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e   .  ** malloc in
13880 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
13890 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20 74  fo() fails and t
138a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
138b0 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a  urns leaving.  *
138c0 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e 20  * wsFlags in an 
138d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
138e0 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ate, the caller 
138f0 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72 65  may behave unpre
13900 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20  dictably..  */. 
13910 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30   memset(pCost, 0
13920 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29  , sizeof(*pCost)
13930 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  );.  pCost->plan
13940 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  .wsFlags = WHERE
13950 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a  _VIRTUALTABLE;..
13960 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
13970 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13980 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
13990 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
139a0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
139b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  and initialized,
139c0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
139d0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
139e0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64   now..  */.  pId
139f0 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e  xInfo = *ppIdxIn
13a00 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
13a10 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70  fo==0 ){.    *pp
13a20 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e  IdxInfo = pIdxIn
13a30 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
13a40 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
13a50 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64 65 72  WC, pSrc, pOrder
13a60 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  By);.  }.  if( p
13a70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
13a80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13a90 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
13aa0 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
13ab0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
13ac0 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
13ad0 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
13ae0 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
13af0 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
13b00 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
13b10 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
13b20 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
13b30 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
13b40 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
13b50 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
13b60 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
13b70 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
13b80 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
13b90 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
13ba0 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
13bb0 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
13bc0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
13bd0 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
13be0 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
13bf0 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
13c00 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
13c10 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
13c20 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
13c30 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
13c40 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
13c50 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
13c60 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
13c70 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
13c80 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
13c90 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
13ca0 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
13cb0 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
13cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13cd0 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
13ce0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 20 29  rse->db, pTab) )
13cf0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
13d00 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73  aConstraint[].us
13d10 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20  able fields and 
13d20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a  initialize all .
13d30 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69    ** output vari
13d40 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20  ables to zero.. 
13d50 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72   **.  ** aConstr
13d60 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73  aint[].usable is
13d70 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72   true for constr
13d80 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65 20  aints where the 
13d90 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20  right-hand.  ** 
13da0 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  side contains on
13db0 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ly references to
13dc0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
13dd0 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72 65  eft of the curre
13de0 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  nt.  ** table.  
13df0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13e00 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  if the constrain
13e10 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
13e20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
13e30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65        column = e
13e40 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  xpr.  **.  ** an
13e50 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  d we are evaluat
13e60 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  ing a join, then
13e70 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
13e80 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20  on column is .  
13e90 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66  ** only valid if
13ea0 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65   all tables refe
13eb0 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f  renced in expr o
13ec0 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74  ccur to the left
13ed0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
13ee0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  le containing co
13ef0 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lumn..  **.  ** 
13f00 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73  The aConstraints
13f10 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
13f20 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  s entries for al
13f30 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  l constraints.  
13f40 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
13f50 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77  t table.  That w
13f60 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20  ay we only have 
13f70 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e  to compute it on
13f80 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  ce.  ** even tho
13f90 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72 79  ugh we might try
13fa0 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73   to pick the bes
13fb0 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65  t index multiple
13fc0 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72   times..  ** For
13fd0 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61 74   each attempt at
13fe0 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65   picking an inde
13ff0 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  x, the order of 
14000 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
14010 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65  ** join might be
14020 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65   different so we
14030 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75   have to recompu
14040 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  te the usable fl
14050 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d  ag.  ** each tim
14060 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  e..  */.  pIdxCo
14070 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
14080 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14090 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
140a0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
140b0 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
140c0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
140d0 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d  tUsage;.  for(i=
140e0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
140f0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
14100 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20   pIdxCons++){.  
14110 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
14120 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
14130 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
14140 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  [j];.    pIdxCon
14150 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65  s->usable = (pTe
14160 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 26  rm->prereqRight&
14170 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20  notReady) ? 0 : 
14180 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  1;.  }.  memset(
14190 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
141a0 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
141b0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
141c0 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
141d0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
141e0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
141f0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
14200 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
14210 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
14220 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
14230 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
14240 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
14250 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
14260 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
14270 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
14280 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c   0;.  /* ((doubl
14290 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20  e)2) In case of 
142a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
142b0 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
142c0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
142d0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
142e0 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28  ITE_BIG_DBL / ((
142f0 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72  double)2);.  nOr
14300 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f  derBy = pIdxInfo
14310 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->nOrderBy;.  if
14320 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  ( !pOrderBy ){. 
14330 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72     pIdxInfo->nOr
14340 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
14350 20 20 69 66 28 20 76 74 61 62 42 65 73 74 49 6e    if( vtabBestIn
14360 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61 62  dex(pParse, pTab
14370 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20  , pIdxInfo) ){. 
14380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
14390 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
143a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
143b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
143c0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
143d0 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
143e0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
143f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
14400 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61 67  ){.    if( pUsag
14410 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
14420 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d   ){.      pCost-
14430 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b  >used |= pWC->a[
14440 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72  pIdxCons[i].iTer
14450 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
14460 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
14470 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
14480 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
14490 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73 65  ause, and the se
144a0 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 74  lected virtual t
144b0 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20  able index.  ** 
144c0 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79  does not satisfy
144d0 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68   it, increase th
144e0 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73 63  e cost of the sc
144f0 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  an accordingly. 
14500 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68 65  This.  ** matche
14510 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
14520 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61 6c   for non-virtual
14530 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74 42   tables in bestB
14540 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20 2a  treeIndex()..  *
14550 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64 78  /.  rCost = pIdx
14560 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
14570 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ost;.  if( pOrde
14580 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f 2d  rBy && pIdxInfo-
14590 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
145a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73 74  ==0 ){.    rCost
145b0 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73 74   += estLog(rCost
145c0 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20 20  )*rCost;.  }..  
145d0 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
145e0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
145f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
14600 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
14610 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c  .  ** inital val
14620 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
14630 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
14640 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
14650 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77  e.  ** (cost<low
14660 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
14670 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
14680 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20  e true..  ** .  
14690 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65 29  ** Use "(double)
146a0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 32  2" instead of "2
146b0 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49 54  .0" in case OMIT
146c0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20  _FLOATING_POINT 
146d0 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  .  ** is defined
146e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53 51  ..  */.  if( (SQ
146f0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
14700 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74 20  ouble)2))<rCost 
14710 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  ){.    pCost->rC
14720 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
14730 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
14740 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
14750 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
14760 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f  rCost;.  }.  pCo
14770 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  st->plan.u.pVtab
14780 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a  Idx = pIdxInfo;.
14790 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
147a0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
147b0 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
147c0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
147d0 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d  ERE_ORDERBY;.  }
147e0 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e  .  pCost->plan.n
147f0 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  Eq = 0;.  pIdxIn
14800 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
14810 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54  OrderBy;..  /* T
14820 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72  ry to find a mor
14830 65 20 65 66 66 69 63 69 65 6e 74 20 61 63 63 65  e efficient acce
14840 73 73 20 70 61 74 74 65 72 6e 20 62 79 20 75 73  ss pattern by us
14850 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
14860 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74  exes.  ** to opt
14870 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70 72  imize an OR expr
14880 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  ession within th
14890 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
148a0 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c  .  */.  bestOrCl
148b0 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
148c0 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
148d0 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
148e0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
148f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
14900 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14910 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
14920 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
14930 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
14940 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  an index structu
14950 72 65 20 74 68 61 74 20 68 61 73 20 61 6e 20 61  re that has an a
14960 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51 4c 49 54  rray of.** SQLIT
14970 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
14980 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20 73 61  evenly spaced sa
14990 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 66 69 72  mples of the fir
149a0 73 74 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  st indexed colum
149b0 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 49  n.** stored in I
149c0 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e 20 54 68  ndex.aSample. Th
149d0 65 73 65 20 73 61 6d 70 6c 65 73 20 64 69 76 69  ese samples divi
149e0 64 65 20 74 68 65 20 64 6f 6d 61 69 6e 20 6f 66  de the domain of
149f0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a   values stored.*
14a00 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  * the index into
14a10 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   (SQLITE_INDEX_S
14a20 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e  AMPLES+1) region
14a30 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63  s..** Region 0 c
14a40 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75  ontains all valu
14a50 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
14a60 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 76 61   first sample va
14a70 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a 2a 20 31  lue. Region.** 1
14a80 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73   contains values
14a90 20 62 65 74 77 65 65 6e 20 74 68 65 20 66 69 72   between the fir
14aa0 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 20 73 61  st and second sa
14ab0 6d 70 6c 65 73 2e 20 20 52 65 67 69 6f 6e 20 32  mples.  Region 2
14ac0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 76 61 6c   contains.** val
14ad0 75 65 73 20 62 65 74 77 65 65 6e 20 73 61 6d 70  ues between samp
14ae0 6c 65 73 20 32 20 61 6e 64 20 33 2e 20 20 41 6e  les 2 and 3.  An
14af0 64 20 73 6f 20 6f 6e 2e 20 20 52 65 67 69 6f 6e  d so on.  Region
14b00 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
14b10 4d 50 4c 45 53 0a 2a 2a 20 63 6f 6e 74 61 69 6e  MPLES.** contain
14b20 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20  s values larger 
14b30 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20 73 61  than the last sa
14b40 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mple..**.** If t
14b50 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
14b60 73 20 6d 61 6e 79 20 64 75 70 6c 69 63 61 74 65  s many duplicate
14b70 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 76 61  s of a single va
14b80 6c 75 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a  lue, then it is.
14b90 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  ** possible that
14ba0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61 64 6a   two or more adj
14bb0 61 63 65 6e 74 20 73 61 6d 70 6c 65 73 20 63 61  acent samples ca
14bc0 6e 20 68 6f 6c 64 20 74 68 65 20 73 61 6d 65 20  n hold the same 
14bd0 76 61 6c 75 65 2e 0a 2a 2a 20 57 68 65 6e 20 74  value..** When t
14be0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
14bf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
14c00 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f  ssible region co
14c10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
14c20 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69  * when roundUp i
14c30 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68 65 20  s false and the 
14c40 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
14c50 20 72 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20   region code is 
14c60 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e  returned.** when
14c70 20 72 6f 75 6e 64 55 70 20 69 73 20 74 72 75 65   roundUp is true
14c80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14c90 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
14ca0 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
14cb0 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65 67  which of the reg
14cc0 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20 70  ions value .** p
14cd0 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65 74  Val lies in, set
14ce0 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20 74  s *piRegion to t
14cf0 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78 20  he region index 
14d00 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  (a value between
14d10 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45   0.** and SQLITE
14d20 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
14d30 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e 64  , inclusive) and
14d40 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
14d50 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  OK..** Or, if an
14d60 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69 6c   OOM occurs whil
14d70 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65 78  e converting tex
14d80 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
14d90 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20 53   encodings,.** S
14da0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
14db0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69 52  eturned and *piR
14dc0 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69 6e  egion is undefin
14dd0 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
14df0 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  2.static int whe
14e00 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a 20  reRangeRegion(. 
14e10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e30 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14e40 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
14e50 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  pIdx,           
14e60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
14e70 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e   consider domain
14e80 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   of */.  sqlite3
14e90 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20  _value *pVal,   
14ea0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
14eb0 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
14ec0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
14ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14ee0 74 75 72 6e 20 6c 61 72 67 65 73 74 20 76 61 6c  turn largest val
14ef0 69 64 20 72 65 67 69 6f 6e 20 69 66 20 74 72 75  id region if tru
14f00 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65  e */.  int *piRe
14f10 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  gion            
14f20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f     /* OUT: Regio
14f30 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77  n of domain in w
14f40 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73 20  hich value lies 
14f50 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
14f60 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20 72 6f  roundUp==0 || ro
14f70 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20 69 66  undUp==1 );.  if
14f80 28 20 41 4c 57 41 59 53 28 70 56 61 6c 29 20 29  ( ALWAYS(pVal) )
14f90 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c  {.    IndexSampl
14fa0 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70 49 64  e *aSample = pId
14fb0 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20  x->aSample;.    
14fc0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  int i = 0;.    i
14fd0 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  nt eType = sqlit
14fe0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
14ff0 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 54  al);..    if( eT
15000 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
15010 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  GER || eType==SQ
15020 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
15030 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
15040 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
15050 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ble(pVal);.     
15060 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49   for(i=0; i<SQLI
15070 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
15080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15090 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
150a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Type==SQLITE_NUL
150b0 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
150c0 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
150d0 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51 4c 49  e[i].eType>=SQLI
150e0 54 45 5f 54 45 58 54 20 29 20 62 72 65 61 6b 3b  TE_TEXT ) break;
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 75  .        if( rou
15100 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ndUp ){.        
15110 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
15120 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a  .u.r>r ) break;.
15130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15140 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61           if( aSa
15150 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72 20 29  mple[i].u.r>=r )
15160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
15180 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 53  lse if( eType==S
15190 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
151a0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
151b0 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
151c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
151d0 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  <SQLITE_INDEX_SA
151e0 4d 50 4c 45 53 20 26 26 20 61 53 61 6d 70 6c 65  MPLES && aSample
151f0 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
15200 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b 0a 20 20  E_NULL ) i++;.  
15210 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15220 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20   .      sqlite3 
15230 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15240 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
15250 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f  *pColl;.      co
15260 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20  nst u8 *z;.     
15270 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f   int n;..      /
15280 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f  * pVal comes fro
15290 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  m sqlite3ValueFr
152a0 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68 65 20  omExpr() so the 
152b0 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  type cannot be N
152c0 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ULL */.      ass
152d0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
152e0 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
152f0 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
15300 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ..      if( eTyp
15310 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
15320 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  {.        z = (c
15330 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
15340 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61  3_value_blob(pVa
15350 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  l);.        pCol
15360 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
15370 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
15380 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53  t( pColl->enc==S
15390 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
153a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
153b0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
153c0 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
153d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
153e0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
153f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
15400 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
15410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15420 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
15430 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
15440 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20  quence: %s",.   
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a         *pIdx->az
15470 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Coll);.         
15480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15490 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
154a0 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
154b0 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56  st u8 *)sqlite3V
154c0 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70  alueText(pVal, p
154d0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
154e0 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20      if( !z ){.  
154f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
15520 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c  ssert( z && pCol
15530 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
15540 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
15550 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c    n = sqlite3Val
15560 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43  ueBytes(pVal, pC
15570 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20  oll->enc);..    
15580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c    for(i=0; i<SQL
15590 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
155a0 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  S; i++){.       
155b0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
155c0 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20  int eSampletype 
155d0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  = aSample[i].eTy
155e0 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
155f0 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c  eSampletype==SQL
15600 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d  ITE_NULL || eSam
15610 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29 20  pletype<eType ) 
15620 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15630 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79    if( (eSamplety
15640 70 65 21 3d 65 54 79 70 65 29 20 29 20 62 72 65  pe!=eType) ) bre
15650 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ak;.#ifndef SQLI
15660 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
15670 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d        if( pColl-
15680 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46  >enc!=SQLITE_UTF
15690 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  8 ){.          i
156a0 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  nt nSample;.    
156b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d        char *zSam
156c0 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ple = sqlite3Utf
156d0 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20  8to16(.         
156e0 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e       db, pColl->
156f0 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  enc, aSample[i].
15700 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  u.z, aSample[i].
15710 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a  nByte, &nSample.
15720 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
15730 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d         if( !zSam
15740 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ple ){.         
15750 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
15760 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15770 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
15780 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
157a0 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d        c = pColl-
157b0 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
157c0 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61  er, nSample, zSa
157d0 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  mple, n, z);.   
157e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
157f0 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65  Free(db, zSample
15800 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
15810 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
15820 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
15830 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
15840 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c  l->pUser, aSampl
15850 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d  e[i].nByte, aSam
15860 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a  ple[i].u.z, n, z
15870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15880 20 20 20 20 20 69 66 28 20 63 2d 72 6f 75 6e 64       if( c-round
15890 55 70 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  Up>=0 ) break;. 
158a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
158b0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
158c0 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  & i<=SQLITE_INDE
158d0 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20  X_SAMPLES );.   
158e0 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69 3b 0a   *piRegion = i;.
158f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15900 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15910 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
15920 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32  ITE_ENABLE_STAT2
15930 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78   */../*.** If ex
15940 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 72  pression pExpr r
15950 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69 74 65  epresents a lite
15960 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74 20 2a  ral value, set *
15970 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  pp to point to.*
15980 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  * an sqlite3_val
15990 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
159a0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61 6d 65  taining the same
159b0 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61 66 66   value, with aff
159c0 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61 70 70  inity.** aff app
159d0 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65 66 6f  lied to it, befo
159e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 74  re returning. It
159f0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15a00 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 0a 2a  bility of the .*
15a10 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
15a20 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
15a30 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 79  his structure by
15a40 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 0a   passing it to .
15a50 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ** sqlite3ValueF
15a60 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
15a70 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 73  the current pars
15a80 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69 6c 65  e is a recompile
15a90 20 28 73 71 6c 69 74 65 33 52 65 70 72 65 70 61   (sqlite3Reprepa
15aa0 72 65 28 29 29 20 61 6e 64 20 70 45 78 70 72 0a  re()) and pExpr.
15ab0 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76 61 72  ** is an SQL var
15ac0 69 61 62 6c 65 20 74 68 61 74 20 63 75 72 72 65  iable that curre
15ad0 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e 2d 4e  ntly has a non-N
15ae0 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e 64 20  ULL value bound 
15af0 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61 74 65  to it,.** create
15b00 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
15b10 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
15b20 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61 6c 75  aining this valu
15b30 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a 2a 2a  e, again with.**
15b40 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 61 70   affinity aff ap
15b50 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69 6e 73  plied to it, ins
15b60 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
15b70 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 61 62  either of the ab
15b80 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74 20 2a  ove apply, set *
15b90 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  pp to NULL..**.*
15ba0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15bb0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
15bc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
15bd0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
15be0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15bf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
15c00 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65  static int value
15c10 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73  FromExpr(.  Pars
15c20 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
15c30 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38  pr *pExpr, .  u8
15c40 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74 65 33   aff, .  sqlite3
15c50 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b 0a 20  _value **pp.){. 
15c60 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
15c70 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20 20 7c  TK_VARIABLE.   |
15c80 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
15c90 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78  _REGISTER && pEx
15ca0 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49  pr->op2==TK_VARI
15cb0 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20 20 69  ABLE).  ){.    i
15cc0 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70 72 2d  nt iVar = pExpr-
15cd0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
15ce0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
15cf0 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
15d00 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49 4d 50  e, iVar); /* IMP
15d10 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38 20  : R-23257-02778 
15d20 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  */.    *pp = sql
15d30 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
15d40 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70  (pParse->pReprep
15d50 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29 3b  are, iVar, aff);
15d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15d70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
15d80 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65  urn sqlite3Value
15d90 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d  FromExpr(pParse-
15da0 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49  >db, pExpr, SQLI
15db0 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70 70  TE_UTF8, aff, pp
15dc0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15dd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15de0 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
15df0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
15e00 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
15e10 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
15e20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
15e30 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
15e40 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
15e50 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
15e60 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
15e70 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
15e80 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
15e90 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
15ea0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
15eb0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
15ec0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
15ed0 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
15ee0 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
15ef0 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
15f00 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
15f10 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
15f20 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
15f30 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
15f40 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
15f50 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
15f80 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
15fa0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
15fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
15fe0 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
15ff0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
16000 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
16010 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
16020 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
16030 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16040 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
16050 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
16060 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
16070 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
16080 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
16090 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
160a0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
160b0 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
160c0 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
160d0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
160e0 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
160f0 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
16100 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
16110 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
16120 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
16130 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
16140 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
16150 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
16160 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16170 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
16180 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
16190 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
161a0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
161b0 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
161c0 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
161d0 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
161e0 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
161f0 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
16200 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
16210 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
16220 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
16230 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
16240 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
16250 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
16260 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
16270 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
16280 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
16290 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
162a0 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69  een 1 and 100, i
162b0 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75  nclusive. A retu
162c0 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31  rn.** value of 1
162d0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
162e0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e  the proposed ran
162f0 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ge scan is expec
16300 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20  ted to visit.** 
16310 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f  approximately 1/
16320 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74 68  100th (1%) of th
16330 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20  e rows selected 
16340 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  by the nEq equal
16350 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
16360 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72  ts (if any). A r
16370 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
16380 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  00 indicates tha
16390 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65 64  t it is expected
163a0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e  .** that the ran
163b0 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  ge scan will vis
163c0 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31 30  it every row (10
163d0 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79 20  0%) selected by 
163e0 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  the equality.** 
163f0 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
16400 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
16410 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
16420 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
16430 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
16440 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
16450 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
16460 65 20 62 79 20 33 2f 34 74 68 73 2e 20 20 48 65  e by 3/4ths.  He
16470 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e  nce a single con
16480 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a  straint (x>?).**
16490 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65   results in a re
164a0 74 75 72 6e 20 6f 66 20 32 35 20 61 6e 64 20 61  turn of 25 and a
164b0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
164c0 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
164d0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
164e0 72 65 74 75 72 6e 20 6f 66 20 36 2e 0a 2a 2f 0a  return of 6..*/.
164f0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
16500 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
16510 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16520 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16530 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
16540 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
16550 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
16560 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
16570 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
16580 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20 63  range-compared c
16590 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20 20  olumn; "x" */.  
165a0 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20  int nEq,        
165b0 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69 6e       /* index in
165c0 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66 20  to p->aCol[] of 
165d0 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72  the range-compar
165e0 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57  ed column */.  W
165f0 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
16600 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
16610 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
16620 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
16630 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
16640 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
16650 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
16660 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
16670 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
16680 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
16690 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20 20   int *piEst     
166a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
166b0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  turn value */.){
166c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
166d0 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
166e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
166f0 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30  T2..  if( nEq==0
16700 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65 20 29   && p->aSample )
16710 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
16720 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c 20 3d  lue *pLowerVal =
16730 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
16740 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56 61 6c  value *pUpperVal
16750 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 45   = 0;.    int iE
16760 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c 6f 77  st;.    int iLow
16770 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  er = 0;.    int 
16780 69 55 70 70 65 72 20 3d 20 53 51 4c 49 54 45 5f  iUpper = SQLITE_
16790 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20  INDEX_SAMPLES;. 
167a0 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 55 70     int roundUpUp
167b0 70 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75  per;.    int rou
167c0 6e 64 55 70 4c 6f 77 65 72 3b 0a 20 20 20 20 75  ndUpLower;.    u
167d0 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
167e0 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
167f0 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
16800 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  ;..    if( pLowe
16810 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
16820 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
16830 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
16840 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
16850 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
16860 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c   pExpr, aff, &pL
16870 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  owerVal);.      
16880 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e  assert( pLower->
16890 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54  eOperator==WO_GT
168a0 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65   || pLower->eOpe
168b0 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a  rator==WO_GE );.
168c0 20 20 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77        roundUpLow
168d0 65 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  er = (pLower->eO
168e0 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20  perator==WO_GT) 
168f0 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ?1:0;.    }.    
16900 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16910 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
16920 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
16930 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
16940 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
16950 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
16960 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
16970 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56 61  , aff, &pUpperVa
16980 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
16990 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ( pUpper->eOpera
169a0 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55  tor==WO_LT || pU
169b0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
169c0 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =WO_LE );.      
169d0 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20 28  roundUpUpper = (
169e0 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
169f0 72 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a  r==WO_LE) ?1:0;.
16a00 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
16a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16a20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26  (pLowerVal==0 &&
16a30 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29   pUpperVal==0) )
16a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
16a50 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56  alueFree(pLowerV
16a60 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  al);.      sqlit
16a70 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70  e3ValueFree(pUpp
16a80 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f  erVal);.      go
16a90 74 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c  to range_est_fal
16aa0 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
16ab0 20 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d   if( pLowerVal==
16ac0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
16ad0 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
16ae0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70  (pParse, p, pUpp
16af0 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70  erVal, roundUpUp
16b00 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  per, &iUpper);. 
16b10 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
16b20 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70 65  ) iLower = iUppe
16b30 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  r/2;.    }else i
16b40 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 20  f( pUpperVal==0 
16b50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
16b60 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
16b70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
16b80 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65  Val, roundUpLowe
16b90 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r, &iLower);.   
16ba0 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20     if( pUpper ) 
16bb0 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77 65 72  iUpper = (iLower
16bc0 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   + SQLITE_INDEX_
16bd0 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a  SAMPLES + 1)/2;.
16be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16bf0 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
16c00 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
16c10 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72 6f 75  , pUpperVal, rou
16c20 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55 70 70  ndUpUpper, &iUpp
16c30 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
16c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
16c60 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
16c70 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56  arse, p, pLowerV
16c80 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72  al, roundUpLower
16c90 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20  , &iLower);.    
16ca0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57 48    }.    }.    WH
16cb0 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65  ERETRACE(("range
16cc0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
16cd0 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72  d..%d\n", iLower
16ce0 2c 20 69 55 70 70 65 72 29 29 3b 0a 0a 20 20 20  , iUpper));..   
16cf0 20 69 45 73 74 20 3d 20 69 55 70 70 65 72 20 2d   iEst = iUpper -
16d00 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65 73   iLower;.    tes
16d10 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53 51 4c  tcase( iEst==SQL
16d20 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
16d30 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  S );.    assert(
16d40 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e   iEst<=SQLITE_IN
16d50 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
16d60 20 20 20 69 66 28 20 69 45 73 74 3c 31 20 29 7b     if( iEst<1 ){
16d70 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20  .      *piEst = 
16d80 35 30 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  50/SQLITE_INDEX_
16d90 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d 65 6c  SAMPLES;.    }el
16da0 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74  se{.      *piEst
16db0 20 3d 20 28 69 45 73 74 2a 31 30 30 29 2f 53 51   = (iEst*100)/SQ
16dc0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
16dd0 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ES;.    }.    sq
16de0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
16df0 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 73  LowerVal);.    s
16e00 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
16e10 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20  pUpperVal);.    
16e20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72  return rc;.  }.r
16e30 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63  ange_est_fallbac
16e40 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  k:.#else.  UNUSE
16e50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
16e60 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
16e70 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
16e80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
16e90 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  Eq);.#endif.  as
16ea0 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
16eb0 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 69 45  pUpper );.  *piE
16ec0 73 74 20 3d 20 31 30 30 3b 0a 20 20 69 66 28 20  st = 100;.  if( 
16ed0 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
16ee0 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
16ef0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70  M_VNULL)==0 ) *p
16f00 69 45 73 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28  iEst /= 4;.  if(
16f10 20 70 55 70 70 65 72 20 29 20 2a 70 69 45 73 74   pUpper ) *piEst
16f20 20 2f 3d 20 34 3b 0a 20 20 72 65 74 75 72 6e 20   /= 4;.  return 
16f30 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
16f40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16f50 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  2./*.** Estimate
16f60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16f70 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
16f80 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
16f90 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
16fa0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
16fb0 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
16fc0 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
16fd0 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
16fe0 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
16ff0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
17000 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
17010 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
17020 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
17030 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74 6f  lite_stat2 histo
17040 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
17050 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
17060 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  at index..**.** 
17070 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
17080 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
17090 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
170a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
170b0 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
170c0 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
170d0 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
170e0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
170f0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
17100 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17110 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
17120 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
17130 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
17140 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
17150 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
17160 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
17170 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
17180 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
17190 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
171a0 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
171b0 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
171c0 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
171d0 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
171e0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
171f0 2a 2f 0a 69 6e 74 20 77 68 65 72 65 45 71 75 61  */.int whereEqua
17200 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
17210 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17220 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
17230 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
17240 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
17250 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17260 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
17270 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
17280 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
17290 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
172a0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
172b0 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
172c0 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
172d0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 64 6f  nstraint */.  do
172e0 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20 20  uble *pnRow     
172f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17300 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
17310 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
17320 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17330 2a 70 52 68 73 20 3d 20 30 3b 20 20 2f 2a 20 56  *pRhs = 0;  /* V
17340 41 4c 55 45 20 6f 6e 20 72 69 67 68 74 2d 68 61  ALUE on right-ha
17350 6e 64 20 73 69 64 65 20 6f 66 20 70 54 65 72 6d  nd side of pTerm
17360 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72   */.  int iLower
17370 2c 20 69 55 70 70 65 72 3b 20 20 20 20 20 20 20  , iUpper;       
17380 2f 2a 20 52 61 6e 67 65 20 6f 66 20 68 69 73 74  /* Range of hist
17390 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f  ogram regions co
173a0 6e 74 61 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f  ntaining pRhs */
173b0 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173d0 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
173e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17400 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
17410 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64  turn code */.  d
17420 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20  ouble nRowEst;  
17430 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
17440 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
17450 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
17460 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
17470 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
17480 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
17490 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
174a0 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  n[0]].affinity;.
174b0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
174c0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
174d0 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b  pr, aff, &pRhs);
174e0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
174f0 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
17500 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 69 66 28  st_cancel;.  if(
17510 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72   pRhs==0 ) retur
17520 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
17530 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52  D;.  rc = whereR
17540 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
17550 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 26  e, p, pRhs, 0, &
17560 69 4c 6f 77 65 72 29 3b 0a 20 20 69 66 28 20 72  iLower);.  if( r
17570 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
17580 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
17590 6c 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52  l;.  rc = whereR
175a0 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
175b0 65 2c 20 70 2c 20 70 52 68 73 2c 20 31 2c 20 26  e, p, pRhs, 1, &
175c0 69 55 70 70 65 72 29 3b 0a 20 20 69 66 28 20 72  iUpper);.  if( r
175d0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
175e0 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
175f0 6c 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  l;.  WHERETRACE(
17600 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
17610 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c  regions: %d..%d\
17620 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  n", iLower, iUpp
17630 65 72 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77  er));.  if( iLow
17640 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
17650 20 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61    nRowEst = p->a
17660 69 52 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49  iRowEst[0]/(SQLI
17670 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
17680 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  *2);.    if( nRo
17690 77 45 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70  wEst<*pnRow ) *p
176a0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
176b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f    }else{.    nRo
176c0 77 45 73 74 20 3d 20 28 69 55 70 70 65 72 2d 69  wEst = (iUpper-i
176d0 4c 6f 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45  Lower)*p->aiRowE
176e0 73 74 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44  st[0]/SQLITE_IND
176f0 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20  EX_SAMPLES;.    
17700 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
17710 3b 0a 20 20 7d 0a 0a 77 68 65 72 65 45 71 75 61  ;.  }..whereEqua
17720 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
17730 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
17740 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
17750 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
17760 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
17770 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29  TE_ENABLE_STAT2)
17780 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
17790 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
177a0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
177b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
177c0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
177d0 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
177e0 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
177f0 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
17800 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
17810 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
17820 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
17830 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
17840 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
17850 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
17860 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
17870 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
17880 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
17890 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
178a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
178b0 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
178c0 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
178d0 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
178e0 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
178f0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
17900 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17910 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
17920 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
17930 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
17940 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
17950 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
17960 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
17970 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17980 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
17990 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
179a0 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
179b0 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
179c0 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
179d0 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
179e0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
179f0 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
17a00 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
17a10 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17a20 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
17a30 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17a40 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
17a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a60 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
17a70 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
17a80 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c  pTerm */.  ExprL
17a90 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
17aa0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
17ab0 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
17ac0 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
17ad0 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c  ...)" */.  doubl
17ae0 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
17af0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
17b00 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
17b10 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  e here */.){.  s
17b20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
17b30 61 6c 20 3d 20 30 3b 20 20 2f 2a 20 4f 6e 65 20  al = 0;  /* One 
17b40 76 61 6c 75 65 20 66 72 6f 6d 20 6c 69 73 74 20  value from list 
17b50 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 77 65 72 2c  */.  int iLower,
17b60 20 69 55 70 70 65 72 3b 20 20 20 20 20 20 20 2f   iUpper;       /
17b70 2a 20 52 61 6e 67 65 20 6f 66 20 68 69 73 74 6f  * Range of histo
17b80 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 63 6f 6e  gram regions con
17b90 74 61 69 6e 69 6e 67 20 70 52 68 73 20 2a 2f 0a  taining pRhs */.
17ba0 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17bc0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
17bd0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
17be0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
17bf0 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
17c00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f  urn code */.  do
17c10 75 62 6c 65 20 6e 52 6f 77 45 73 74 3b 20 20 20  uble nRowEst;   
17c20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 65          /* New e
17c30 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
17c40 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
17c50 0a 20 20 69 6e 74 20 6e 53 70 61 6e 20 3d 20 30  .  int nSpan = 0
17c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17c70 4e 75 6d 62 65 72 20 6f 66 20 68 69 73 74 6f 67  Number of histog
17c80 72 61 6d 20 72 65 67 69 6f 6e 73 20 73 70 61 6e  ram regions span
17c90 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 69  ned */.  int nSi
17ca0 6e 67 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  ngle = 0;       
17cb0 20 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20     /* Histogram 
17cc0 72 65 67 69 6f 6e 73 20 68 69 74 20 62 79 20 61  regions hit by a
17cd0 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 2a 2f   single value */
17ce0 0a 20 20 69 6e 74 20 6e 4e 6f 74 46 6f 75 6e 64  .  int nNotFound
17cf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
17d00 43 6f 75 6e 74 20 6f 66 20 76 61 6c 75 65 73 20  Count of values 
17d10 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e  that are not con
17d20 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  stants */.  int 
17d30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17d60 20 2a 2f 0a 20 20 75 38 20 61 53 70 61 6e 5b 53   */.  u8 aSpan[S
17d70 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
17d80 4c 45 53 2b 31 5d 3b 20 20 20 20 2f 2a 20 48 69  LES+1];    /* Hi
17d90 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20  stogram regions 
17da0 74 68 61 74 20 61 72 65 20 73 70 61 6e 6e 65 64  that are spanned
17db0 20 2a 2f 0a 20 20 75 38 20 61 53 69 6e 67 6c 65   */.  u8 aSingle
17dc0 5b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  [SQLITE_INDEX_SA
17dd0 4d 50 4c 45 53 2b 31 5d 3b 20 20 2f 2a 20 48 69  MPLES+1];  /* Hi
17de0 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20  stogram regions 
17df0 68 69 74 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  hit once */..  a
17e00 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
17e10 65 21 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d 20  e!=0 );.  aff = 
17e20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  p->pTable->aCol[
17e30 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e  p->aiColumn[0]].
17e40 61 66 66 69 6e 69 74 79 3b 0a 20 20 6d 65 6d 73  affinity;.  mems
17e50 65 74 28 61 53 70 61 6e 2c 20 30 2c 20 73 69 7a  et(aSpan, 0, siz
17e60 65 6f 66 28 61 53 70 61 6e 29 29 3b 0a 20 20 6d  eof(aSpan));.  m
17e70 65 6d 73 65 74 28 61 53 69 6e 67 6c 65 2c 20 30  emset(aSingle, 0
17e80 2c 20 73 69 7a 65 6f 66 28 61 53 69 6e 67 6c 65  , sizeof(aSingle
17e90 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
17ea0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
17eb0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
17ec0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
17ed0 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46  .    rc = valueF
17ee0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
17ef0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
17f00 72 2c 20 61 66 66 2c 20 26 70 56 61 6c 29 3b 0a  r, aff, &pVal);.
17f10 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
17f20 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  ak;.    if( pVal
17f30 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76  ==0 || sqlite3_v
17f40 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d  alue_type(pVal)=
17f50 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
17f60 20 20 20 20 20 20 6e 4e 6f 74 46 6f 75 6e 64 2b        nNotFound+
17f70 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
17f80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  e;.    }.    rc 
17f90 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
17fa0 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 56  on(pParse, p, pV
17fb0 61 6c 2c 20 30 2c 20 26 69 4c 6f 77 65 72 29 3b  al, 0, &iLower);
17fc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
17fd0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 77 68  eak;.    rc = wh
17fe0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
17ff0 50 61 72 73 65 2c 20 70 2c 20 70 56 61 6c 2c 20  Parse, p, pVal, 
18000 31 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20  1, &iUpper);.   
18010 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
18020 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
18030 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
18040 20 61 53 69 6e 67 6c 65 5b 69 4c 6f 77 65 72 5d   aSingle[iLower]
18050 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
18060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
18070 4c 6f 77 65 72 3e 3d 30 20 26 26 20 69 55 70 70  Lower>=0 && iUpp
18080 65 72 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  er<=SQLITE_INDEX
18090 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20  _SAMPLES );.    
180a0 20 20 77 68 69 6c 65 28 20 69 4c 6f 77 65 72 3c    while( iLower<
180b0 69 55 70 70 65 72 20 29 20 61 53 70 61 6e 5b 69  iUpper ) aSpan[i
180c0 4c 6f 77 65 72 2b 2b 5d 20 3d 20 31 3b 0a 20 20  Lower++] = 1;.  
180d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
180e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
180f0 20 20 20 66 6f 72 28 69 3d 6e 53 70 61 6e 3d 30     for(i=nSpan=0
18100 3b 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45  ; i<=SQLITE_INDE
18110 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b  X_SAMPLES; i++){
18120 0a 20 20 20 20 20 20 69 66 28 20 61 53 70 61 6e  .      if( aSpan
18130 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  [i] ){.        n
18140 53 70 61 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  Span++;.      }e
18150 6c 73 65 20 69 66 28 20 61 53 69 6e 67 6c 65 5b  lse if( aSingle[
18160 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 53  i] ){.        nS
18170 69 6e 67 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  ingle++;.      }
18180 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 6f 77 45  .    }.    nRowE
18190 73 74 20 3d 20 28 6e 53 70 61 6e 2a 32 2b 6e 53  st = (nSpan*2+nS
181a0 69 6e 67 6c 65 29 2a 70 2d 3e 61 69 52 6f 77 45  ingle)*p->aiRowE
181b0 73 74 5b 30 5d 2f 28 32 2a 53 51 4c 49 54 45 5f  st[0]/(2*SQLITE_
181c0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 29 0a 20  INDEX_SAMPLES). 
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
181e0 6e 4e 6f 74 46 6f 75 6e 64 2a 70 2d 3e 61 69 52  nNotFound*p->aiR
181f0 6f 77 45 73 74 5b 31 5d 3b 0a 20 20 20 20 69 66  owEst[1];.    if
18200 28 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61  ( nRowEst > p->a
18210 69 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f  iRowEst[0] ) nRo
18220 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45  wEst = p->aiRowE
18230 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f  st[0];.    *pnRo
18240 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
18250 20 57 48 45 52 45 54 52 41 43 45 28 28 22 49 4e   WHERETRACE(("IN
18260 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20 6e   row estimate: n
18270 53 70 61 6e 3d 25 64 2c 20 6e 53 69 6e 67 6c 65  Span=%d, nSingle
18280 3d 25 64 2c 20 6e 4e 6f 74 46 6f 75 6e 64 3d 25  =%d, nNotFound=%
18290 64 2c 20 65 73 74 3d 25 67 5c 6e 22 2c 0a 20 20  d, est=%g\n",.  
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
182b0 53 70 61 6e 2c 20 6e 53 69 6e 67 6c 65 2c 20 6e  Span, nSingle, n
182c0 4e 6f 74 46 6f 75 6e 64 2c 20 6e 52 6f 77 45 73  NotFound, nRowEs
182d0 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
182e0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
182f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18300 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
18310 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18320 45 5f 53 54 41 54 32 29 20 2a 2f 0a 0a 0a 2f 2a  E_STAT2) */.../*
18330 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73  .** Find the bes
18340 74 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  t query plan for
18350 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72   accessing a par
18360 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
18370 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73  Write the.** bes
18380 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64  t query plan and
18390 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74   its cost into t
183a0 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a  he WhereCost obj
183b0 65 63 74 20 73 75 70 70 6c 69 65 64 20 61 73 20  ect supplied as 
183c0 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 72 61  the.** last para
183d0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
183e0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 6c 61   lowest cost pla
183f0 6e 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73  n wins.  The cos
18400 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  t is an estimate
18410 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   of the amount o
18420 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73  f.** CPU and dis
18430 6b 20 49 2f 4f 20 6e 65 65 64 65 64 20 74 6f 20  k I/O needed to 
18440 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75  process the requ
18450 65 73 74 65 64 20 72 65 73 75 6c 74 2e 0a 2a 2a  ested result..**
18460 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e   Factors that in
18470 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63  fluence cost inc
18480 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  lude:.**.**    *
18490 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20    The estimated 
184a0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
184b0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72  hat will be retr
184c0 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20  ieved.  (The.** 
184d0 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20        fewer the 
184e0 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  better.).**.**  
184f0 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
18500 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74  not sorting must
18510 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   occur..**.**   
18520 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
18530 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  ot there must be
18540 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70   separate lookup
18550 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  s in the.**     
18560 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74    index and in t
18570 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
18580 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61  *.** If there wa
18590 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
185a0 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49  clause (pSrc->pI
185b0 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74  ndex) attached t
185c0 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a  o the table in.*
185d0 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
185e0 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
185f0 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
18600 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
18610 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
18620 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75   index. If no su
18630 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64  ch plan is found
18640 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
18650 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53  ned cost is.** S
18660 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49  QLITE_BIG_DBL. I
18670 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  f a plan is foun
18680 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  d that uses the 
18690 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a  named index, .**
186a0 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
186b0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20  s calculated in 
186c0 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a  the usual way..*
186d0 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e  *.** If a NOT IN
186e0 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70 53  DEXED clause (pS
186f0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d  rc->notIndexed!=
18700 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64 20  0) was attached 
18710 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  to the table .**
18720 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
18730 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e  tatement, then n
18740 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f  o indexes are co
18750 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65  nsidered. Howeve
18760 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63  r, the .** selec
18770 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69  ted plan may sti
18780 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  ll take advantag
18790 65 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  e of the built-i
187a0 6e 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  n rowid primary 
187b0 6b 65 79 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f  key.** index..*/
187c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
187d0 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 50  tBtreeIndex(.  P
187e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
187f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18800 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
18810 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
18820 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
18830 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
18840 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
18850 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18860 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
18870 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
18880 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
18890 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
188a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
188b0 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
188c0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
188d0 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
188e0 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
188f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
18900 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
18910 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  le for any purpo
18920 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
18930 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
18940 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
18950 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
18960 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
18970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18980 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
18990 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e   plan */.){.  in
189a0 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
189b0 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
189c0 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
189d0 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
189e0 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
189f0 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
18a00 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
18a10 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
18a20 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ng */.  Index *p
18a30 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
18a40 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
18a50 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66  Probe, or zero f
18a60 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a  or IPK index */.
18a70 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
18a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18a90 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66   Current mask of
18aa0 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
18ab0 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
18ac0 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b  nt idxEqTermMask
18ad0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
18ae0 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  dex mask of vali
18af0 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
18b00 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tors */.  Index 
18b10 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
18b20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
18b30 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
18b40 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
18b50 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
18b60 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
18b70 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73  ; /* The aiRowEs
18b80 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
18b90 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
18ba0 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   int aiColumnPk 
18bb0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
18bc0 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
18bd0 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
18be0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77  index */.  int w
18bf0 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20  sFlagMask;      
18c00 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65         /* Allowe
18c10 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74  d flags in pCost
18c20 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f  ->plan.wsFlag */
18c30 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
18c40 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20  e the cost to a 
18c50 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65  worst-case value
18c60 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
18c70 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
18c80 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d  Cost));.  pCost-
18c90 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  >rCost = SQLITE_
18ca0 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49  BIG_DBL;..  /* I
18cb0 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65  f the pSrc table
18cc0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
18cd0 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
18ce0 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e  IN then we may n
18cf0 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69  ot.  ** use an i
18d00 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20  ndex to satisfy 
18d10 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
18d20 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c  nts on that tabl
18d30 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a  e.  This is.  **
18d40 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
18d50 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
18d60 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  ing NULL if the 
18d70 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d  table does not m
18d80 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69  atch -.  ** a ci
18d90 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68  rcumstance which
18da0 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
18db0 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76  t help us discov
18dc0 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37  er.  Ticket #217
18dd0 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  7..  */.  if( pS
18de0 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
18df0 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64  T_LEFT ){.    id
18e00 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f  xEqTermMask = WO
18e10 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  _EQ|WO_IN;.  }el
18e20 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72  se{.    idxEqTer
18e30 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
18e40 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  _IN|WO_ISNULL;. 
18e50 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   }..  if( pSrc->
18e60 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
18e70 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
18e80 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
18e90 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
18ea0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
18eb0 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d   pIdx = pProbe =
18ec0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
18ed0 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20     wsFlagMask = 
18ee0 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  ~(WHERE_ROWID_EQ
18ef0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
18f00 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d  GE);.    eqTermM
18f10 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d  ask = idxEqTermM
18f20 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
18f30 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
18f40 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18f50 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
18f60 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
18f70 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
18f80 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
18f90 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
18fa0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
18fb0 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
18fc0 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
18fd0 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
18fe0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
18ff0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
19000 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
19010 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
19020 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
19030 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19050 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
19060 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
19070 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
19080 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
19090 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
190a0 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
190b0 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
190c0 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
190d0 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
190e0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
190f0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
19100 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
19110 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
19120 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
19130 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
19140 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
19150 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
19160 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
19170 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
19180 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
19190 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
191a0 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
191b0 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
191c0 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
191d0 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
191e0 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
191f0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
19200 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
19210 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
19220 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
19230 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
19240 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
19250 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
19260 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
19270 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48   = ~(.        WH
19280 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
19290 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
192a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
192b0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
192c0 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71  GE.    );.    eq
192d0 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
192e0 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78  |WO_IN;.    pIdx
192f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
19300 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
19310 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  dices looking fo
19320 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74  r the best one t
19330 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  o use.  */.  for
19340 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d  (; pProbe; pIdx=
19350 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
19360 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Next){.    const
19370 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20   unsigned int * 
19380 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d  const aiRowEst =
19390 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
193a0 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  t;.    double co
193b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
193c0 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
193d0 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
193e0 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19400 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
19410 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
19420 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 69  ult set */.    i
19430 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  nt rev;         
19440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19450 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ue to scan in re
19460 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
19470 20 20 20 64 6f 75 62 6c 65 20 6e 53 65 61 72 63     double nSearc
19480 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
19490 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
194a0 65 72 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61  er of binary sea
194b0 72 63 68 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  rches */.    int
194c0 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
194d0 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
194e0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   0;..    /* The 
194f0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
19500 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
19510 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70  d based on the p
19520 72 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20  roperties of.   
19530 20 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20   ** index being 
19540 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20  evaluated. They 
19550 61 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f  are then used to
19560 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
19570 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63  xpected.    ** c
19580 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ost and number o
19590 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e  f rows returned.
195a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
195b0 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
195c0 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
195d0 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
195e0 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
195f0 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
19600 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
19610 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
19620 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
19630 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
19640 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
19650 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
19660 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
19670 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
19680 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
19690 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
196a0 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
196b0 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
196c0 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
196d0 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
196e0 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
196f0 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
19700 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
19710 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
19720 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
19730 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
19740 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
19750 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
19760 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
19770 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
19780 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
19790 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
197a0 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
197b0 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
197c0 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
197d0 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
197e0 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
197f0 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
19800 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
19810 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
19820 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
19830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
19840 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
19850 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
19860 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
19870 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
19880 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
19890 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
198a0 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
198b0 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
198c0 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
198d0 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
198e0 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
198f0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
19900 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
19910 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
19920 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
19930 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
19940 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
19950 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
19960 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
19970 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
19980 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
19990 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
199a0 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
199b0 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
199c0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
199d0 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
199e0 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
199f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
19a00 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
19a10 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
19a20 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
19a30 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
19a40 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
19a50 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
19a60 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
19a70 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
19a80 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
19a90 2a 2a 20 20 65 73 74 42 6f 75 6e 64 3a 0a 20 20  **  estBound:.  
19aa0 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
19ab0 61 74 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  ate on the amoun
19ac0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
19ad0 68 61 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  hat must be sear
19ae0 63 68 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20  ched.  A.    ** 
19af0 20 20 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20     value of 100 
19b00 6d 65 61 6e 73 20 74 68 65 20 65 6e 74 69 72 65  means the entire
19b10 20 74 61 62 6c 65 20 69 73 20 73 65 61 72 63 68   table is search
19b20 65 64 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73 74  ed.  Range const
19b30 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20  raints.    **   
19b40 20 6d 69 67 68 74 20 72 65 64 75 63 65 20 74 68   might reduce th
19b50 69 73 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65  is to a value le
19b60 73 73 20 74 68 61 6e 20 31 30 30 20 74 6f 20 69  ss than 100 to i
19b70 6e 64 69 63 61 74 65 20 74 68 61 74 20 6f 6e 6c  ndicate that onl
19b80 79 0a 20 20 20 20 2a 2a 20 20 20 20 61 20 66 72  y.    **    a fr
19b90 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  action of the ta
19ba0 62 6c 65 20 6e 65 65 64 73 20 73 65 61 72 63 68  ble needs search
19bb0 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 61 62 73  ing.  In the abs
19bc0 65 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ence of.    **  
19bd0 20 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41    sqlite_stat2 A
19be0 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 61 20 73  NALYZE data, a s
19bf0 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79  ingle inequality
19c00 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
19c10 72 63 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70  rch.    **    sp
19c20 61 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73  ace to 1/4rd its
19c30 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20   original size. 
19c40 20 53 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74   So an x>? const
19c50 72 61 69 6e 74 20 72 65 64 75 63 65 73 0a 20 20  raint reduces.  
19c60 20 20 2a 2a 20 20 20 20 65 73 74 42 6f 75 6e 64    **    estBound
19c70 20 74 6f 20 32 35 2e 20 20 54 77 6f 20 63 6f 6e   to 25.  Two con
19c80 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
19c90 44 20 78 3c 3f 29 20 72 65 64 75 63 65 20 65 73  D x<?) reduce es
19ca0 74 42 6f 75 6e 64 20 74 6f 20 36 2e 0a 20 20 20  tBound to 6..   
19cb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72   **.    **  bSor
19cc0 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20  t:   .    **    
19cd0 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
19ce0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
19cf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68 61  ER BY clause tha
19d00 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
19d10 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74  n .    **    ext
19d20 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e  ernal sort (i.e.
19d30 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e   scanning the in
19d40 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61  dex being evalua
19d50 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20  ted will not .  
19d60 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74 6c    **    correctl
19d70 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73 29  y order records)
19d80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19d90 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a   bLookup: .    *
19da0 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
19db0 75 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f  ue if a table lo
19dc0 6f 6b 75 70 20 69 73 20 72 65 71 75 69 72 65 64  okup is required
19dd0 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
19de0 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20  entry.    **    
19df0 76 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68  visited.  In oth
19e00 65 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69  er words, true i
19e10 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
19e20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
19e30 20 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69      **    This i
19e40 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66  s always false f
19e50 6f 72 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  or the rowid pri
19e60 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f  mary key index o
19e70 66 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  f a table..    *
19e80 2a 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69  *    For other i
19e90 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72  ndexes, it is tr
19ea0 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68  ue unless all th
19eb0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
19ec0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
19ed0 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
19ee0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ECT statement ar
19ef0 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
19f00 20 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a   index (such an.
19f10 20 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20      **    index 
19f20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73  is sometimes des
19f30 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65  cribed as a cove
19f40 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20  ring index)..   
19f50 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70   **    For examp
19f60 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e  le, given the in
19f70 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
19f80 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65  he second of the
19f90 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
19fa0 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65  **    two querie
19fb0 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65  s requires table
19fc0 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20   b-tree lookups 
19fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64  in order to find
19fe0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
19ff0 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63  *    of column c
1a000 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  , but the first 
1a010 64 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65  does not because
1a020 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62   columns a and b
1a030 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62   are.    **    b
1a040 6f 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  oth available in
1a050 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1a060 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1a070 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1a080 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48  b    FROM tbl WH
1a090 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1a0a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1a0b0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
1a0c0 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1a0d0 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  1;.    */.    in
1a0e0 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a100 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1a110 4e 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  N terms matching
1a120 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1a130 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20  t bInEst = 0;   
1a140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a150 72 75 65 20 69 66 20 22 78 20 49 4e 20 28 53 45  rue if "x IN (SE
1a160 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a  LECT...)" seen *
1a170 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c  /.    int nInMul
1a180 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1a190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a1a0 20 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69   distinct equali
1a1b0 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a  ties to lookup *
1a1c0 2f 0a 20 20 20 20 69 6e 74 20 65 73 74 42 6f 75  /.    int estBou
1a1d0 6e 64 20 3d 20 31 30 30 3b 20 20 20 20 20 20 20  nd = 100;       
1a1e0 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
1a1f0 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65   reduction in se
1a200 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20  arch space */.  
1a210 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30    int nBound = 0
1a220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e  /* Number of ran
1a240 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1a250 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  een */.    int b
1a260 53 6f 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Sort = 0;       
1a270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a280 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72   if external sor
1a290 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
1a2a0 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20    int bLookup = 
1a2b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a2c0 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61  /* True if not a
1a2d0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1a2e0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1a2f0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1a300 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1a310 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1a320 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1a330 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a340 45 5f 53 54 41 54 32 0a 20 20 20 20 57 68 65 72  E_STAT2.    Wher
1a350 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1a360 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1a370 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1a380 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1a390 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74  ndif..    /* Det
1a3a0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1a3b0 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e  s of nEq and nIn
1a3c0 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  Mul */.    for(n
1a3d0 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65  Eq=0; nEq<pProbe
1a3e0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b  ->nColumn; nEq++
1a3f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
1a400 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1a410 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54  n[nEq];.      pT
1a420 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
1a430 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1a440 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
1a450 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
1a460 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
1a470 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c  reak;.      wsFl
1a480 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1a490 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1a4a0 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69  WID_EQ);.      i
1a4b0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1a4c0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1a4d0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1a4e0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
1a4f0 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  r;.        wsFla
1a500 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1a510 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
1a520 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1a530 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1a540 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1a550 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
1a560 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73  ELECT ...)":  As
1a570 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20  sume the SELECT 
1a580 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
1a590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  */.          nIn
1a5a0 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
1a5b0 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
1a5c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1a5d0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
1a5e0 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
1a5f0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1a600 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1a610 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
1a620 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
1a630 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1a640 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  l *= pExpr->x.pL
1a650 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1a660 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1a670 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1a680 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
1a690 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  LL ){.        ws
1a6a0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1a6b0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
1a6c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1a6d0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20  E_ENABLE_STAT2. 
1a6e0 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
1a6f0 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70  && pProbe->aSamp
1a700 6c 65 20 29 20 70 46 69 72 73 74 54 65 72 6d 20  le ) pFirstTerm 
1a710 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a  = pTerm;.#endif.
1a720 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
1a730 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1a740 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a750 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
1a760 6c 75 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e  lue of estBound.
1a770 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c   */.    if( nEq<
1a780 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
1a790 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
1a7a0 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1a7b0 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 69 66  n[nEq];.      if
1a7c0 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
1a7d0 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
1a7e0 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
1a7f0 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1a800 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ) ){.        Whe
1a810 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66  reTerm *pTop = f
1a820 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
1a830 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
1a840 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64  WO_LT|WO_LE, pId
1a850 78 29 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  x);.        Wher
1a860 65 54 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69  eTerm *pBtm = fi
1a870 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1a880 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
1a890 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78  O_GT|WO_GE, pIdx
1a8a0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
1a8b0 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61  RangeScanEst(pPa
1a8c0 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71  rse, pProbe, nEq
1a8d0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 65  , pBtm, pTop, &e
1a8e0 73 74 42 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20  stBound);.      
1a8f0 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20 20    if( pTop ){.  
1a900 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 20 3d          nBound =
1a910 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73   1;.          ws
1a920 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
1a930 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
1a940 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 6f 70      used |= pTop
1a950 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1a960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a970 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20 20 20   if( pBtm ){.   
1a980 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b         nBound++;
1a990 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61  .          wsFla
1a9a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
1a9b0 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
1a9c0 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e 70   used |= pBtm->p
1a9d0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
1a9e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73      }.        ws
1a9f0 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f  Flags |= (WHERE_
1aa00 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
1aa10 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b  RE_ROWID_RANGE);
1aa20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1aa30 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f  se if( pProbe->o
1aa40 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
1aa50 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1aa60 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
1aa70 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a  RE_COLUMN_IN );.
1aa80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aa90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1aaa0 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20  COLUMN_NULL );. 
1aab0 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67       if( (wsFlag
1aac0 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1aad0 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_IN|WHERE_COLUM
1aae0 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20  N_NULL))==0 ){. 
1aaf0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1ab00 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
1ab10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ab20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1ab30 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1ab40 61 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e 64  ause and the ind
1ab50 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  ex being conside
1ab60 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  red will.    ** 
1ab70 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20 72  naturally scan r
1ab80 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75 69  ows in the requi
1ab90 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20 74  red order, set t
1aba0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  he appropriate f
1abb0 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20 77  lags.    ** in w
1abc0 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73  sFlags. Otherwis
1abd0 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
1abe0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1abf0 65 20 62 75 74 20 74 68 65 20 69 6e 64 65 78 0a  e but the index.
1ac00 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e      ** will scan
1ac10 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66 65   rows in a diffe
1ac20 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74 20  rent order, set 
1ac30 74 68 65 20 62 53 6f 72 74 20 76 61 72 69 61 62  the bSort variab
1ac40 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
1ac50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ac60 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26    if( (wsFlags &
1ac70 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49   (WHERE_COLUMN_I
1ac80 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  N|WHERE_COLUMN_N
1ac90 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20 20  ULL))==0.       
1aca0 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49 6e 64   && isSortingInd
1acb0 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e 70  ex(pParse,pWC->p
1acc0 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69  MaskSet,pProbe,i
1acd0 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71  Cur,pOrderBy,nEq
1ace0 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29 7b 0a  ,&rev).      ){.
1acf0 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
1ad00 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  |= WHERE_ROWID_R
1ad10 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
1ad20 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52  N_RANGE|WHERE_OR
1ad30 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 77  DERBY;.        w
1ad40 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76 20 3f  sFlags |= (rev ?
1ad50 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 3a   WHERE_REVERSE :
1ad60 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1ad70 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74 20  {.        bSort 
1ad80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ad90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 75   }..    /* If cu
1ada0 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61 74  rrently calculat
1adb0 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ing the cost of 
1adc0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 28  using an index (
1add0 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20 20 20  not the IPK.    
1ade0 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74 65 72  ** index), deter
1adf0 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65 71 75  mine if all requ
1ae00 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61  ired column data
1ae10 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1ae20 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20 2a 2a   without .    **
1ae30 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20   using the main 
1ae40 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66 20 74  table (i.e. if t
1ae50 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 63 6f  he index is a co
1ae60 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69 6e  vering.    ** in
1ae70 64 65 78 20 66 6f 72 20 74 68 69 73 20 71 75 65  dex for this que
1ae80 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20 73  ry). If it is, s
1ae90 65 74 20 74 68 65 20 57 48 45 52 45 5f 49 44 58  et the WHERE_IDX
1aea0 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20 20  _ONLY flag in.  
1aeb0 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f 74    ** wsFlags. Ot
1aec0 68 65 72 77 69 73 65 2c 20 73 65 74 20 74 68 65  herwise, set the
1aed0 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62 6c   bLookup variabl
1aee0 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e to true.  */. 
1aef0 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 77     if( pIdx && w
1af00 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  sFlags ){.      
1af10 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
1af20 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
1af30 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
1af40 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
1af50 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
1af60 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49        int x = pI
1af70 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
1af80 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42  .        if( x<B
1af90 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  MS-1 ){.        
1afa0 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61    m &= ~(((Bitma
1afb0 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20  sk)1)<<x);.     
1afc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1afd0 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20     if( m==0 ){. 
1afe0 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1aff0 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
1b000 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b010 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20 3d         bLookup =
1b020 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1b030 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1b040 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
1b050 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
1b060 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20  output.  For an 
1b070 22 78 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e  "x IN (SELECT...
1b080 29 22 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  )".    ** constr
1b090 61 69 6e 74 2c 20 64 6f 20 6e 6f 74 20 6c 65 74  aint, do not let
1b0a0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 65 78   the estimate ex
1b0b0 63 65 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f  ceed half the ro
1b0c0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1b0d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  .    */.    nRow
1b0e0 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f   = (double)(aiRo
1b0f0 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d  wEst[nEq] * nInM
1b100 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  ul);.    if( bIn
1b110 45 73 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69  Est && nRow*2>ai
1b120 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20  RowEst[0] ){.   
1b130 20 20 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45     nRow = aiRowE
1b140 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e  st[0]/2;.      n
1b150 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52  InMul = (int)(nR
1b160 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45  ow / aiRowEst[nE
1b170 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  q]);.    }..#ifd
1b180 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1b190 5f 53 54 41 54 32 0a 20 20 20 20 2f 2a 20 49 66  _STAT2.    /* If
1b1a0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1b1b0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 78  is of the form x
1b1c0 3d 56 41 4c 55 45 20 61 6e 64 20 68 69 73 74 6f  =VALUE and histo
1b1d0 67 72 61 6d 0a 20 20 20 20 2a 2a 20 64 61 74 61  gram.    ** data
1b1e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
1b1f0 72 20 63 6f 6c 75 6d 6e 20 78 2c 20 74 68 65 6e  r column x, then
1b200 20 69 74 20 6d 69 67 68 74 20 62 65 20 70 6f 73   it might be pos
1b210 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 6f 20  sible.    ** to 
1b220 67 65 74 20 61 20 62 65 74 74 65 72 20 65 73 74  get a better est
1b230 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 6e 75 6d  imate on the num
1b240 62 65 72 20 6f 66 20 72 6f 77 73 20 62 61 73 65  ber of rows base
1b250 64 20 6f 6e 0a 20 20 20 20 2a 2a 20 56 41 4c 55  d on.    ** VALU
1b260 45 20 61 6e 64 20 68 6f 77 20 63 6f 6d 6d 6f 6e  E and how common
1b270 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 20 61   that value is a
1b280 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
1b290 68 69 73 74 6f 67 72 61 6d 2e 0a 20 20 20 20 2a  histogram..    *
1b2a0 2f 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 28  /.    if( nRow>(
1b2b0 64 6f 75 62 6c 65 29 31 20 26 26 20 6e 45 71 3d  double)1 && nEq=
1b2c0 3d 31 20 26 26 20 70 46 69 72 73 74 54 65 72 6d  =1 && pFirstTerm
1b2d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1b2e0 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70   pFirstTerm->eOp
1b2f0 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 7b  erator==WO_EQ ){
1b300 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45 71  .        whereEq
1b310 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
1b320 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
1b330 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  tTerm->pExpr->pR
1b340 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  ight, &nRow);.  
1b350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46      }else if( pF
1b360 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1b370 74 6f 72 3d 3d 57 4f 5f 49 4e 20 26 26 20 62 49  tor==WO_IN && bI
1b380 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nEst==0 ){.     
1b390 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73     whereInScanEs
1b3a0 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1b3b0 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45  , pFirstTerm->pE
1b3c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
1b3d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Row);.      }.  
1b3e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1b3f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1b400 32 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64 6a  2 */..    /* Adj
1b410 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ust the number o
1b420 66 20 72 6f 77 73 20 61 6e 64 20 74 68 65 20 63  f rows and the c
1b430 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 74 6f 20  ost downward to 
1b440 72 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20  reflect rows.   
1b450 20 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63   ** that are exc
1b460 6c 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63  luded by range c
1b470 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
1b480 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e  */.    nRow = (n
1b490 52 6f 77 20 2a 20 28 64 6f 75 62 6c 65 29 65 73  Row * (double)es
1b4a0 74 42 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c  tBound) / (doubl
1b4b0 65 29 31 30 30 3b 0a 20 20 20 20 69 66 28 20 6e  e)100;.    if( n
1b4c0 52 6f 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31  Row<1 ) nRow = 1
1b4d0 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 73 75 6d 65  ;..    /* Assume
1b4e0 20 63 6f 6e 73 74 61 6e 74 20 63 6f 73 74 20 74   constant cost t
1b4f0 6f 20 61 64 76 61 6e 63 65 20 66 72 6f 6d 20 6f  o advance from o
1b500 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65  ne row to the ne
1b510 78 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6c 6f  xt and.    ** lo
1b520 67 61 72 69 74 68 6d 69 63 20 63 6f 73 74 20 74  garithmic cost t
1b530 6f 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65  o do a binary se
1b540 61 72 63 68 2e 20 20 48 65 6e 63 65 2c 20 74 68  arch.  Hence, th
1b550 65 20 69 6e 69 74 69 61 6c 20 63 6f 73 74 0a 20  e initial cost. 
1b560 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
1b570 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
1b580 77 73 20 70 6c 75 73 20 6c 6f 67 32 28 74 61 62  ws plus log2(tab
1b590 6c 65 2d 73 69 7a 65 29 20 74 69 6d 65 73 20 74  le-size) times t
1b5a0 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
1b5b0 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61 72 63   of binary searc
1b5c0 68 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hes..    **.    
1b5d0 2a 2a 20 42 65 63 61 75 73 65 20 66 61 6e 2d 6f  ** Because fan-o
1b5e0 75 74 20 6f 6e 20 74 61 62 6c 65 73 20 69 73 20  ut on tables is 
1b5f0 73 6f 20 6d 75 63 68 20 68 69 67 68 65 72 20 74  so much higher t
1b600 68 61 6e 20 74 68 65 20 66 61 6e 2d 6f 75 74 20  han the fan-out 
1b610 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  on.    ** indice
1b620 73 20 28 62 65 63 61 75 73 65 20 74 61 62 6c 65  s (because table
1b630 20 62 74 72 65 65 73 20 63 6f 6e 74 61 69 6e 20   btrees contain 
1b640 6f 6e 6c 79 20 69 6e 74 65 67 65 72 20 6b 65 79  only integer key
1b650 73 20 69 6e 20 6e 6f 6e 2d 6c 65 61 66 0a 20 20  s in non-leaf.  
1b660 20 20 2a 2a 20 6e 6f 64 65 73 29 20 77 65 20 77    ** nodes) we w
1b670 65 69 67 68 74 20 74 68 65 20 63 6f 73 74 20 6f  eight the cost o
1b680 66 20 61 20 74 61 62 6c 65 20 62 69 6e 61 72 79  f a table binary
1b690 20 73 65 61 72 63 68 20 61 73 20 31 2f 31 30 74   search as 1/10t
1b6a0 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73  h the.    ** cos
1b6b0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 69  t of an index bi
1b6c0 6e 61 72 79 20 73 65 61 72 63 68 2e 0a 20 20 20  nary search..   
1b6d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
1b6e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 4c   ){.      if( bL
1b6f0 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20  ookup ){.       
1b700 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78   /* For an index
1b710 20 6c 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64   lookup followed
1b720 20 62 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b   by a table look
1b730 75 70 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  up:.        **  
1b740 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
1b750 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1b760 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1b770 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20  h index range.  
1b780 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1b790 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1b7a0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1b7b0 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c   **  + nRow tabl
1b7c0 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f  e searches to lo
1b7d0 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20 65  okup the table e
1b7e0 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 72  ntry using the r
1b7f0 6f 77 69 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  owid.        */.
1b800 20 20 20 20 20 20 20 20 6e 53 65 61 72 63 68 20          nSearch 
1b810 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77 2f  = nInMul + nRow/
1b820 31 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  10;.      }else{
1b830 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
1b840 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1b850 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  :.        **    
1b860 20 6e 49 6e 4d 75 6c 20 62 69 6e 61 72 79 20 73   nInMul binary s
1b870 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1b880 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72  the initial entr
1b890 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  y .        **   
1b8a0 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72  + nRow steps thr
1b8b0 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20  ough the index. 
1b8c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b8d0 20 20 6e 53 65 61 72 63 68 20 3d 20 6e 49 6e 4d    nSearch = nInM
1b8e0 75 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ul;.      }.    
1b8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1b900 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d  For a rowid prim
1b910 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a  ary key lookup:.
1b920 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
1b930 75 6c 74 20 62 69 6e 61 72 79 20 73 65 61 72 63  ult binary searc
1b940 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
1b950 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 73 63  initial entry sc
1b960 61 6c 65 64 20 62 79 20 31 2f 31 30 74 68 0a 20  aled by 1/10th. 
1b970 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1b980 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68  steps through th
1b990 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  e table.      */
1b9a0 0a 20 20 20 20 20 20 6e 53 65 61 72 63 68 20 3d  .      nSearch =
1b9b0 20 6e 49 6e 4d 75 6c 2f 31 30 3b 0a 20 20 20 20   nInMul/10;.    
1b9c0 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  }.    cost = nRo
1b9d0 77 20 2b 20 6e 53 65 61 72 63 68 2a 65 73 74 4c  w + nSearch*estL
1b9e0 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29 3b  og(aiRowEst[0]);
1b9f0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20  ..    /* Add in 
1ba00 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f  the estimated co
1ba10 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
1ba20 65 20 72 65 73 75 6c 74 2e 20 20 54 68 69 73 20  e result.  This 
1ba30 63 6f 73 74 20 69 73 20 65 78 70 61 6e 64 65 64  cost is expanded
1ba40 0a 20 20 20 20 2a 2a 20 62 79 20 61 20 66 75 64  .    ** by a fud
1ba50 67 65 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30  ge factor of 3.0
1ba60 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
1ba70 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 20  the fact that a 
1ba80 73 6f 72 74 69 6e 67 20 73 74 65 70 20 0a 20 20  sorting step .  
1ba90 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 61 20    ** involves a 
1baa0 77 72 69 74 65 20 61 6e 64 20 69 73 20 74 68 75  write and is thu
1bab0 73 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  s more expensive
1bac0 20 74 68 61 6e 20 61 20 6c 6f 6f 6b 75 70 20 73   than a lookup s
1bad0 74 65 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tep..    */.    
1bae0 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20  if( bSort ){.   
1baf0 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a     cost += nRow*
1bb00 65 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 28 64 6f  estLog(nRow)*(do
1bb10 75 62 6c 65 29 33 3b 0a 20 20 20 20 7d 0a 0a 20  uble)3;.    }.. 
1bb20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66     /**** Cost of
1bb30 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65   using this inde
1bb40 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63  x has now been c
1bb50 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20  omputed ****/.. 
1bb60 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1bb70 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  re additional co
1bb80 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69  nstraints on thi
1bb90 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e  s table that can
1bba0 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73  not.    ** be us
1bbb0 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ed with the curr
1bbc0 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77  ent index, but w
1bbd0 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72  hich might lower
1bbe0 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
1bbf0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  ** of output row
1bc00 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52  s, adjust the nR
1bc10 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69  ow value accordi
1bc20 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79  ngly.  This only
1bc30 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73   .    ** matters
1bc40 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
1bc50 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65 61  index is the lea
1bc60 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f  st costly, so do
1bc70 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20   not bother.    
1bc80 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74 65  ** with this ste
1bc90 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  p if we already 
1bca0 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20  know this index 
1bcb0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73  will not be chos
1bcc0 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  en..    ** Also,
1bcd0 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
1bce0 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75  e output row cou
1bcf0 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67  nt below 2 using
1bd00 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20   this step..    
1bd10 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20  **.    ** It is 
1bd20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74 68  critical that th
1bd30 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20  e notValid mask 
1bd40 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e 73  be used here ins
1bd50 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74  tead of.    ** t
1bd60 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b  he notReady mask
1bd70 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e  .  When computin
1bd80 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69  g an "optimal" i
1bd90 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65 61  ndex, the notRea
1bda0 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77  dy.    ** mask w
1bdb0 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e  ill only have on
1bdc0 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65 20  e bit set - the 
1bdd0 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  bit for the curr
1bde0 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ent table..    *
1bdf0 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d  * The notValid m
1be00 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65  ask, on the othe
1be10 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20 68  r hand, always h
1be20 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20  as all bits set 
1be30 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  for.    ** table
1be40 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69  s that are not i
1be50 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20  n outer loops.  
1be60 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20 75  If notReady is u
1be70 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64  sed here instead
1be80 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61  .    ** of notVa
1be90 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74 69  lid, then a opti
1bea0 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 64  mal index that d
1beb0 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20  epends on inner 
1bec0 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20  joins loops.    
1bed0 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c 65  ** might be sele
1bee0 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20 74  cted even when t
1bef0 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 6f  here exists an o
1bf00 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1bf10 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  t has.    ** no 
1bf20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79 2e  such dependency.
1bf30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bf40 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d  nRow>2 && cost<=
1bf50 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a  pCost->rCost ){.
1bf60 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1bf90 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1bfa0 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20 20  nSkipEq = nEq;  
1bfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bfc0 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61  er of == constra
1bfd0 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
1bfe0 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52        int nSkipR
1bff0 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20  ange = nBound;  
1c000 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c010 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  < constraints to
1c020 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42   skip */.      B
1c030 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20  itmask thisTab; 
1c040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c050 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a  itmap for pSrc *
1c060 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62  /..      thisTab
1c070 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e   = getMask(pWC->
1c080 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
1c090 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
1c0a0 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e  =pWC->a, k=pWC->
1c0b0 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26  nTerm; nRow>2 &&
1c0c0 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
1c0d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1c0e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1c0f0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63  TERM_VIRTUAL ) c
1c100 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1c110 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1c120 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69  reqAll & notVali
1c130 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63 6f  d)!=thisTab ) co
1c140 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1c150 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1c160 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
1c170 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29  _IN|WO_ISNULL) )
1c180 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1c190 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20 20  nSkipEq ){.     
1c1a0 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65         /* Ignore
1c1b0 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20 65   the first nEq e
1c1c0 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73 20  quality matches 
1c1d0 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a  since the index.
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
1c1f0 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75  as already accou
1c200 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a  nted for these *
1c210 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53  /.            nS
1c220 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20  kipEq--;.       
1c230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c240 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20        /* Assume 
1c250 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  each additional 
1c260 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20 72  equality match r
1c270 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c  educes the resul
1c280 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
1c290 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66   set size by a f
1c2a0 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20  actor of 10 */. 
1c2b0 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20             nRow 
1c2c0 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  /= 10;.         
1c2d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1c2e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1c2f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57  rator & (WO_LT|W
1c300 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
1c310 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
1c320 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b  f( nSkipRange ){
1c330 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1c340 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74  Ignore the first
1c350 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e 67   nSkipRange rang
1c360 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 69  e constraints si
1c370 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20  nce the index.  
1c380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
1c390 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74   already account
1c3a0 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a  ed for these */.
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69              nSki
1c3c0 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20  pRange--;.      
1c3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3e0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
1c3f0 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
1c400 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1c410 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  t reduces the re
1c420 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1c430 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1c440 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20 20  a factor of 3.  
1c450 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f  Indexed range co
1c460 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63 65  nstraints reduce
1c470 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1c480 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
1c490 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61 63   by a larger fac
1c4a0 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65  tor: 4.  We make
1c4b0 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a 20   indexed range. 
1c4c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f             ** mo
1c4d0 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e 74  re selective int
1c4e0 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75  entionally becau
1c4f0 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65 63  se of the subjec
1c500 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20 20  tive .          
1c510 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e    ** observation
1c520 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72 61   that indexed ra
1c530 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
1c540 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a  really are more.
1c550 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1c560 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61 63  elective in prac
1c570 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67 65  tice, on average
1c580 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1c590 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20   nRow /= 3;.    
1c5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c5b0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1c5c0 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e  >eOperator!=WO_N
1c5d0 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OOP ){.         
1c5e0 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78   /* Any other ex
1c5f0 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20  pression lowers 
1c600 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63  the output row c
1c610 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a  ount by half */.
1c620 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f            nRow /
1c630 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
1c640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c650 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d   nRow<2 ) nRow =
1c660 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20   2;.    }...    
1c670 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20  WHERETRACE((.   
1c680 20 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71 3d     "%s(%s): nEq=
1c690 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74  %d nInMul=%d est
1c6a0 42 6f 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25  Bound=%d bSort=%
1c6b0 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46  d bLookup=%d wsF
1c6c0 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20  lags=0x%x\n".   
1c6d0 20 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f 74     "         not
1c6e0 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6e 52 6f  Ready=0x%llx nRo
1c6f0 77 3d 25 2e 32 66 20 63 6f 73 74 3d 25 2e 32 66  w=%.2f cost=%.2f
1c700 20 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c   used=0x%llx\n",
1c710 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61  .      pSrc->pTa
1c720 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20  b->zName, (pIdx 
1c730 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
1c740 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e  "ipk"), .      n
1c750 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42  Eq, nInMul, estB
1c760 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f  ound, bSort, bLo
1c770 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20  okup, wsFlags,. 
1c780 20 20 20 20 20 6e 6f 74 52 65 61 64 79 2c 20 6e       notReady, n
1c790 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a  Row, cost, used.
1c7a0 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20      ));..    /* 
1c7b0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  If this index is
1c7c0 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76   the best we hav
1c7d0 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74  e seen so far, t
1c7e0 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a  hen record this.
1c7f0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
1c800 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65   its cost in the
1c810 20 70 43 6f 73 74 20 73 74 72 75 63 74 75 72 65   pCost structure
1c820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c830 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61   (!pIdx || wsFla
1c840 67 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73  gs).     && (cos
1c850 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c  t<pCost->rCost |
1c860 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e  | (cost<=pCost->
1c870 72 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70 43  rCost && nRow<pC
1c880 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 29 29  ost->plan.nRow))
1c890 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1c8a0 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73  ost->rCost = cos
1c8b0 74 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  t;.      pCost->
1c8c0 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20  used = used;.   
1c8d0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e     pCost->plan.n
1c8e0 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
1c8f0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
1c900 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73  Flags = (wsFlags
1c910 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20  &wsFlagMask);.  
1c920 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1c930 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  nEq = nEq;.     
1c940 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1c950 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
1c960 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1c970 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
1c980 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
1c990 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
1c9a0 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
1c9b0 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
1c9c0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
1c9d0 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  dex ) break;..  
1c9e0 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73    /* Reset masks
1c9f0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e   for the next in
1ca00 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
1ca10 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  */.    wsFlagMas
1ca20 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49  k = ~(WHERE_ROWI
1ca30 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
1ca40 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54  _RANGE);.    eqT
1ca50 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54  ermMask = idxEqT
1ca60 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20  ermMask;.  }..  
1ca70 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
1ca80 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
1ca90 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  e and the SQLITE
1caa0 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c  _ReverseOrder fl
1cab0 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20  ag.  ** is set, 
1cac0 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65  then reverse the
1cad0 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20   order that the 
1cae0 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63  index will be sc
1caf0 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54  anned.  ** in. T
1cb00 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
1cb10 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74  application test
1cb20 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e  ing, to help fin
1cb30 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65  d cases.  ** whe
1cb40 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62  re application b
1cb50 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73  ehaviour depends
1cb60 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e   on the (undefin
1cb70 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20  ed) order that. 
1cb80 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75   ** SQLite outpu
1cb90 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68  ts rows in in th
1cba0 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20  e absence of an 
1cbb0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1cbc0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64    */.  if( !pOrd
1cbd0 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e  erBy && pParse->
1cbe0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1cbf0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1cc00 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
1cc10 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
1cc20 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d  ERE_REVERSE;.  }
1cc30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
1cc40 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e  erBy || (pCost->
1cc50 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
1cc60 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29  RE_ORDERBY)==0 )
1cc70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 73  ;.  assert( pCos
1cc80 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
1cc90 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61  0 || (pCost->pla
1cca0 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
1ccb0 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a  ROWID_EQ)==0 );.
1ccc0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
1ccd0 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
1cce0 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e    || pCost->plan
1ccf0 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20  .u.pIdx==0 .    
1cd00 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61     || pCost->pla
1cd10 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e  n.u.pIdx==pSrc->
1cd20 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20  pIndex .  );..  
1cd30 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
1cd40 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e  t index is: %s\n
1cd50 22 2c 20 0a 20 20 20 20 28 28 70 43 6f 73 74 2d  ", .    ((pCost-
1cd60 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1cd70 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
1cd80 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e 65 22 20  AN)==0 ? "none" 
1cd90 3a 20 0a 20 20 20 20 20 20 20 20 20 70 43 6f 73  : .         pCos
1cda0 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f  t->plan.u.pIdx ?
1cdb0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1cdc0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1cdd0 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62  k").  ));.  .  b
1cde0 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
1cdf0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1ce00 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
1ce10 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
1ce20 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62 65 73 74  , pCost);.  best
1ce30 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
1ce40 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
1ce50 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 43 6f 73  , notReady, pCos
1ce60 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61  t);.  pCost->pla
1ce70 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65 71 54  n.wsFlags |= eqT
1ce80 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ermMask;.}../*.*
1ce90 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
1cea0 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
1ceb0 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63 2d 3e  ing table pSrc->
1cec0 70 54 61 62 2e 20 57 72 69 74 65 20 74 68 65 0a  pTab. Write the.
1ced0 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70 6c  ** best query pl
1cee0 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20  an and its cost 
1cef0 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f  into the WhereCo
1cf00 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69  st object suppli
1cf10 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 6c 61  ed .** as the la
1cf20 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  st parameter. Th
1cf30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
1cf40 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f  calculate the co
1cf50 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20 72 65  st of.** both re
1cf60 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74  al and virtual t
1cf70 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f 0a 73  able scans..*/.s
1cf80 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
1cf90 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
1cfa0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1cfb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1cfc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1cfd0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1cfe0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1cff0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d000 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1d010 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
1d020 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d030 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
1d040 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
1d050 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
1d060 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
1d070 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1d080 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e  able for indexin
1d090 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  g */.  Bitmask n
1d0a0 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20  otValid,        
1d0b0 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f     /* Cursors no
1d0c0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
1d0d0 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20  any purpose */. 
1d0e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1d0f0 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
1d100 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1d110 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  use */.  WhereCo
1d120 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20  st *pCost       
1d130 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63       /* Lowest c
1d140 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  ost query plan *
1d150 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
1d160 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d170 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
1d180 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62  rtual(pSrc->pTab
1d190 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1d1a0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d  _index_info *p =
1d1b0 20 30 3b 0a 20 20 20 20 62 65 73 74 56 69 72 74   0;.    bestVirt
1d1c0 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
1d1d0 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
1d1e0 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20  eady, notValid, 
1d1f0 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c  pOrderBy, pCost,
1d200 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  &p);.    if( p->
1d210 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1d220 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d230 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72  3_free(p->idxStr
1d240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d250 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1d260 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c  e->db, p);.  }el
1d270 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d280 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
1d290 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
1d2a0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
1d2b0 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79  tValid, pOrderBy
1d2c0 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pCost);.  }.}.
1d2d0 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
1d2e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
1d2f0 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
1d300 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
1d310 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
1d320 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
1d330 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d340 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
1d350 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
1d360 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
1d370 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
1d380 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
1d390 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
1d3a0 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
1d3b0 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
1d3c0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
1d3d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
1d3e0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
1d3f0 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
1d400 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
1d410 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1d420 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1d430 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
1d440 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
1d450 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
1d460 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
1d470 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
1d480 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
1d490 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
1d4a0 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
1d4b0 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
1d4c0 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
1d4d0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
1d4e0 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
1d4f0 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
1d500 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
1d510 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
1d520 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
1d530 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
1d540 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
1d550 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  .**.** IMPLEMENT
1d560 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39  ATION-OF: R-2459
1d570 37 2d 35 38 36 35 35 20 4e 6f 20 74 65 73 74 73  7-58655 No tests
1d580 20 61 72 65 20 64 6f 6e 65 20 66 6f 72 20 74 65   are done for te
1d590 72 6d 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  rms that are.** 
1d5a0 63 6f 6d 70 6c 65 74 65 6c 79 20 73 61 74 69 73  completely satis
1d5b0 66 69 65 64 20 62 79 20 69 6e 64 69 63 65 73 2e  fied by indices.
1d5c0 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
1d5d0 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
1d5e0 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
1d5f0 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
1d600 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
1d610 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
1d620 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
1d630 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
1d640 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
1d650 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
1d660 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
1d670 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
1d680 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
1d690 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
1d6a0 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
1d6b0 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
1d6c0 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
1d6d0 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
1d6e0 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
1d6f0 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
1d700 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
1d710 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
1d720 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
1d730 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
1d740 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
1d750 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
1d760 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
1d770 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
1d780 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
1d790 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
1d7a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
1d7b0 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
1d7c0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
1d7d0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
1d7e0 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
1d7f0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77      && (pTerm->w
1d800 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1d810 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  DED)==0.      &&
1d820 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
1d830 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
1d840 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
1d850 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
1d860 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
1d870 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
1d880 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
1d890 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
1d8a0 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
1d8b0 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
1d8c0 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
1d8d0 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
1d8e0 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
1d8f0 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
1d900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
1d910 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1d920 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
1d930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1d940 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
1d950 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
1d960 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63  e to apply the c
1d970 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
1d980 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f  tring zAff.** to
1d990 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73   the n registers
1d9a0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73   starting at bas
1d9b0 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20  e. .**.** As an 
1d9c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51  optimization, SQ
1d9d0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
1d9e0 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65  tries (which are
1d9f0 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a   no-ops) at the.
1da00 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  ** beginning and
1da10 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65   end of zAff are
1da20 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c   ignored.  If al
1da30 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66  l entries in zAf
1da40 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f are.** SQLITE_
1da50 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e  AFF_NONE, then n
1da60 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65  o code gets gene
1da70 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rated..**.** Thi
1da80 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
1da90 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
1daa0 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65  zAff so that the
1dab0 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a   caller is free.
1dac0 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66  ** to modify zAf
1dad0 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  f after this rou
1dae0 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tine returns..*/
1daf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1db00 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50  eApplyAffinity(P
1db10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1db20 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63  t base, int n, c
1db30 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64  har *zAff){.  Vd
1db40 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1db50 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66  pVdbe;.  if( zAf
1db60 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
1db70 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
1db80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1db90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1dba0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
1dbb0 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62  ;..  /* Adjust b
1dbc0 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69  ase and n to ski
1dbd0 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46  p over SQLITE_AF
1dbe0 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61  F_NONE entries a
1dbf0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
1dc00 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20    ** and end of 
1dc10 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
1dc20 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ing..  */.  whil
1dc30 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30  e( n>0 && zAff[0
1dc40 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
1dc50 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
1dc60 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a     base++;.    z
1dc70 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69  Aff++;.  }.  whi
1dc80 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b  le( n>1 && zAff[
1dc90 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  n-1]==SQLITE_AFF
1dca0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
1dcb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65  ;.  }..  /* Code
1dcc0 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
1dcd0 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65   opcode if there
1dce0 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66   is anything lef
1dcf0 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66  t to do. */.  if
1dd00 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n>0 ){.    sql
1dd10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dd20 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
1dd30 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
1dd40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1dd50 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29  (v, -1, zAff, n)
1dd60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1dd70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1dd80 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73  ange(pParse, bas
1dd90 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e, n);.  }.}.../
1dda0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1ddb0 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
1ddc0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
1ddd0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1dde0 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
1ddf0 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
1de00 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
1de10 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
1de20 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
1de30 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
1de40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
1de50 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
1de60 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
1de70 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
1de80 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
1de90 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
1dea0 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
1deb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1dec0 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
1ded0 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
1dee0 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
1def0 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
1df00 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
1df10 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
1df20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
1df30 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
1df40 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
1df50 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
1df60 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
1df70 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
1df80 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1df90 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
1dfa0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1dfb0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1dfc0 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
1dfd0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1dfe0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
1dff0 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
1e000 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
1e010 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
1e020 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e030 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
1e040 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  n */.  int iTarg
1e050 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
1e060 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
1e070 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
1e080 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1e090 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
1e0a0 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
1e0b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e0c0 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1e0f0 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
1e100 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
1e110 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
1e120 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
1e130 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1e140 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1e150 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1e160 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1e170 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
1e180 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
1e190 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
1e1a0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1e1b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1e1c0 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
1e1d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e1e0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
1e1f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
1e200 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
1e210 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
1e220 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
1e230 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
1e240 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
1e250 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
1e260 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
1e270 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
1e280 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
1e290 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
1e2a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e2b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1e2c0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
1e2d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1e2e0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1e2f0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
1e300 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
1e310 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
1e320 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
1e330 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
1e340 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1e350 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
1e360 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
1e370 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
1e380 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
1e390 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
1e3a0 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
1e3b0 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
1e3c0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1e3f0 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
1e400 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
1e410 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
1e420 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
1e430 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
1e440 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
1e450 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
1e460 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
1e470 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
1e480 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
1e490 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
1e4a0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
1e4b0 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
1e4c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1e4d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1e4e0 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
1e4f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e500 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
1e510 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
1e520 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1e530 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
1e540 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
1e550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e560 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
1e570 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
1e580 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
1e590 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
1e5a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1e5b0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
1e5c0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1e5d0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
1e5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e5f0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1e600 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
1e610 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
1e620 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
1e630 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  dex..**.** For e
1e640 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
1e650 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
1e660 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
1e670 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
1e680 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
1e690 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
1e6a0 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
1e6b0 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
1e6c0 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
1e6d0 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
1e6e0 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
1e6f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1e700 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
1e710 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
1e720 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
1e730 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
1e740 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
1e750 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1e760 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
1e770 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
1e780 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1e790 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
1e7a0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
1e7b0 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
1e7c0 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
1e7d0 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
1e7e0 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
1e7f0 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
1e800 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
1e810 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
1e820 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1e830 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
1e840 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
1e850 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
1e860 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1e870 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
1e880 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
1e890 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
1e8a0 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
1e8b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
1e8c0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
1e8d0 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
1e8e0 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
1e8f0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
1e900 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
1e910 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
1e920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e930 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
1e940 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
1e950 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
1e960 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
1e970 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
1e980 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
1e990 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
1e9a0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1e9b0 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
1e9c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
1e9d0 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
1e9e0 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
1e9f0 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
1ea00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
1ea10 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
1ea20 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1ea30 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
1ea40 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
1ea50 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
1ea60 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
1ea70 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
1ea80 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
1ea90 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
1eaa0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
1eab0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1eac0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
1ead0 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1eae0 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
1eaf0 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
1eb00 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
1eb10 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
1eb20 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
1eb30 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
1eb40 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
1eb50 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
1eb60 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
1eb70 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
1eb80 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
1eb90 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
1eba0 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
1ebb0 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
1ebc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1ebd0 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1ebe0 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
1ebf0 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
1ec00 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
1ec10 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
1ec20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
1ec30 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
1ec40 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
1ec50 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
1ec60 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
1ec70 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
1ec80 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
1ec90 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
1eca0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ecb0 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
1ecc0 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
1ecd0 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
1ece0 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
1ecf0 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
1ed00 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
1ed10 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
1ed20 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
1ed30 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
1ed40 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
1ed50 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
1ed60 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
1ed70 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
1ed80 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1ed90 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
1eda0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
1edb0 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1edc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1edd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1ede0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1edf0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1ee00 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
1ee10 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
1ee20 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
1ee30 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
1ee40 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
1ee50 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1ee60 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
1ee70 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
1ee80 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
1ee90 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
1eea0 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
1eeb0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
1eec0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
1eed0 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
1eee0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
1eef0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
1ef00 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
1ef10 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
1ef20 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
1ef30 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
1ef40 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   nEq = pLevel->p
1ef50 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68  lan.nEq;   /* Th
1ef60 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
1ef70 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
1ef80 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64   to code */.  Vd
1ef90 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1efa0 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
1efb0 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
1efc0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
1efd0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eff0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
1f000 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
1f010 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
1f020 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
1f030 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
1f040 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
1f050 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1f060 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1f070 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
1f080 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
1f090 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1f0c0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
1f0d0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1f0e0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
1f0f0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
1f100 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
1f110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f120 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
1f130 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1f140 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f160 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
1f170 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
1f180 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
1f190 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
1f1a0 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
1f1b0 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
1f1c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1f1d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1f1e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
1f1f0 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20  XED );.  pIdx = 
1f200 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
1f210 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  Idx;..  /* Figur
1f220 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
1f230 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
1f240 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
1f250 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
1f260 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
1f270 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1f280 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d    nReg = pLevel-
1f290 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74  >plan.nEq + nExt
1f2a0 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d  raReg;.  pParse-
1f2b0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a  >nMem += nReg;..
1f2c0 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33    zAff = sqlite3
1f2d0 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
1f2e0 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65  >db, sqlite3Inde
1f2f0 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
1f300 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a  pIdx));.  if( !z
1f310 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Aff ){.    pPars
1f320 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1f330 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  led = 1;.  }..  
1f340 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
1f350 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1f360 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
1f370 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
1f380 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
1f390 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
1f3a0 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
1f3b0 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
1f3c0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1f3d0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
1f3e0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
1f3f0 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
1f400 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20  ->plan.wsFlags, 
1f410 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 4e  pIdx);.    if( N
1f420 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29  EVER(pTerm==0) )
1f430 20 62 72 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54   break;.    /* T
1f440 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75  he following tru
1f450 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
1f460 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
1f470 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
1f480 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
1f490 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
1f4a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f4b0 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
1f4c0 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
1f4d0 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
1f4e0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1f4f0 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
1f500 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1f510 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f520 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
1f530 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
1f540 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75      r1 = codeEqu
1f550 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
1f560 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c  , pTerm, pLevel,
1f570 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
1f580 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73 65   if( r1!=regBase
1f590 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  +j ){.      if( 
1f5a0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nReg==1 ){.     
1f5b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1f5c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f5d0 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20 20   regBase);.     
1f5e0 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31 3b     regBase = r1;
1f5f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f600 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f610 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1f620 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73 65  opy, r1, regBase
1f630 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1f640 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1f650 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1f660 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  r & WO_ISNULL );
1f670 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1f680 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1f690 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69  & WO_IN );.    i
1f6a0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1f6b0 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
1f6c0 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
1f6d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
1f6e0 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  ht = pTerm->pExp
1f6f0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
1f700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f710 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
1f720 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c  ight, regBase+j,
1f730 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1f740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
1f750 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  f ){.        if(
1f760 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1f770 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20  ffinity(pRight, 
1f780 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45  zAff[j])==SQLITE
1f790 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1f7a0 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1f7b0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1f7c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f7d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1f7e0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
1f7f0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
1f800 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20   zAff[j]) ){.   
1f810 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d         zAff[j] =
1f820 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1f830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1f850 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
1f860 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
1f870 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1f880 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1f890 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f8a0 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  ne is a helper f
1f8b0 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  or explainIndexR
1f8c0 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a  ange() below.**.
1f8d0 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68  ** pStr holds th
1f8e0 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70  e text of an exp
1f8f0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20  ression that we 
1f900 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20  are building up 
1f910 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61  one term.** at a
1f920 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75   time.  This rou
1f930 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20  tine adds a new 
1f940 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20  term to the end 
1f950 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1f960 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20  n..** Terms are 
1f970 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44  separated by AND
1f980 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44   so add the "AND
1f990 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e  " text for secon
1f9a0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1f9b0 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a  .** terms only..
1f9c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1f9d0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1f9e0 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53  (.  StrAccum *pS
1f9f0 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
1fa00 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72  /* The text expr
1fa10 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69  ession being bui
1fa20 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  lt */.  int iTer
1fa30 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1fa40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1fa50 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73  this term.  Firs
1fa60 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63  t is zero */.  c
1fa70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1fa80 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  mn,        /* Na
1fa90 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1faa0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1fab0 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20   *zOp           
1fac0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1fad0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   operator */.){.
1fae0 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71    if( iTerm ) sq
1faf0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1fb00 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20  end(pStr, " AND 
1fb10 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 5);.  sqlite3
1fb20 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
1fb30 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31  Str, zColumn, -1
1fb40 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1fb50 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1fb60 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69   zOp, 1);.  sqli
1fb70 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1fb80 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b  d(pStr, "?", 1);
1fb90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
1fba0 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69  nt pLevel descri
1fbb0 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20 66  bes a strategy f
1fbc0 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c  or scanning tabl
1fbd0 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a  e pTab. This .**
1fbe0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1fbf0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1fc00 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 63   string buffer c
1fc10 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73 63  ontaining a desc
1fc20 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
1fc30 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c  e subset of tabl
1fc40 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62  e rows scanned b
1fc50 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69  y the strategy i
1fc60 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e  n the form of an
1fc70 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
1fc80 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72  on. Or, if all r
1fc90 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64 2c  ows are scanned,
1fca0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1fcb0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1fcc0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1fcd0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
1fce0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1fcf0 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a  RE a=1 AND b>2;.
1fd00 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64  **.** is run and
1fd10 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
1fd20 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68  ex on (a, b), th
1fd30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1fd40 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74   returns a.** st
1fd50 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ring similar to:
1fd60 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e  .**.**   "a=? AN
1fd70 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65  D b>?".**.** The
1fd80 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
1fd90 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  r points to memo
1fda0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1fdb0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1fdc0 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
1fdd0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1fde0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1fdf0 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65 72   free the buffer
1fe00 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e   when it is.** n
1fe10 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
1fe20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
1fe30 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  r *explainIndexR
1fe40 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64 62  ange(sqlite3 *db
1fe50 2c 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  , WhereLevel *pL
1fe60 65 76 65 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61  evel, Table *pTa
1fe70 62 29 7b 0a 20 20 57 68 65 72 65 50 6c 61 6e 20  b){.  WherePlan 
1fe80 2a 70 50 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c  *pPlan = &pLevel
1fe90 2d 3e 70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20  ->plan;.  Index 
1fea0 2a 70 49 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d  *pIndex = pPlan-
1feb0 3e 75 2e 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e  >u.pIdx;.  int n
1fec0 45 71 20 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b  Eq = pPlan->nEq;
1fed0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43  .  int i, j;.  C
1fee0 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54  olumn *aCol = pT
1fef0 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20  ab->aCol;.  int 
1ff00 2a 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64  *aiColumn = pInd
1ff10 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ex->aiColumn;.  
1ff20 53 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20  StrAccum txt;.. 
1ff30 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28   if( nEq==0 && (
1ff40 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26  pPlan->wsFlags &
1ff50 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
1ff60 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
1ff70 54 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  T))==0 ){.    re
1ff80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
1ff90 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
1ffa0 74 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51  t(&txt, 0, 0, SQ
1ffb0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
1ffc0 3b 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b  ;.  txt.db = db;
1ffd0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1ffe0 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22  umAppend(&txt, "
1fff0 20 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69   (", 2);.  for(i
20000 3d 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b  =0; i<nEq; i++){
20010 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
20020 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
20030 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d  aCol[aiColumn[i]
20040 5d 2e 7a 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20  ].zName, "=");. 
20050 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69   }..  j = i;.  i
20060 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67  f( pPlan->wsFlag
20070 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  s&WHERE_BTM_LIMI
20080 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  T ){.    explain
20090 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
200a0 20 69 2b 2b 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c   i++, aCol[aiCol
200b0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22  umn[j]].zName, "
200c0 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
200d0 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48  Plan->wsFlags&WH
200e0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
200f0 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
20100 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2c 20  ndTerm(&txt, i, 
20110 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
20120 5d 2e 7a 4e 61 6d 65 2c 20 22 3c 22 29 3b 0a 20  ].zName, "<");. 
20130 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
20140 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74 2c  ccumAppend(&txt,
20150 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74 75   ")", 1);.  retu
20160 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
20170 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b 0a  umFinish(&txt);.
20180 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20190 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
201a0 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
201b0 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
201c0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
201d0 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  LAN.** command. 
201e0 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65 69  If the query bei
201f0 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20 61  ng compiled is a
20200 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
20210 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a 2a  PLAN, a single.*
20220 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  * record is adde
20230 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
20240 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
20250 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61 74  table scan strat
20260 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76 65  egy in .** pLeve
20270 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
20280 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  d explainOneScan
20290 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
202a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
202b0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
202c0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
202d0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
202e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
202f0 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f  le list this loo
20300 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20  p refers to */. 
20310 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
20320 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
20330 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69 74   /* Scan to writ
20340 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  e OP_Explain opc
20350 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ode for */.  int
20360 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20380 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
20390 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
203a0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  ut */.  int iFro
203b0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
203c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
203d0 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75   for "from" colu
203e0 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
203f0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
20420 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
20430 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20  eBegin() */.){. 
20440 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
20450 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 75  lain==2 ){.    u
20460 33 32 20 66 6c 61 67 73 20 3d 20 70 4c 65 76 65  32 flags = pLeve
20470 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b  l->plan.wsFlags;
20480 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
20490 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
204a0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
204b0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
204c0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
204d0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
204e0 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e   /* VM being con
204f0 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20  structed */.    
20500 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20510 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a  arse->db;     /*
20520 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
20530 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   */.    char *zM
20540 73 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sg;             
20550 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f        /* Text to
20560 20 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70   add to EQP outp
20570 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ut */.    sqlite
20580 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b 20 20 20  3_int64 nRow;   
20590 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
205a0 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
205b0 77 73 20 76 69 73 69 74 65 64 20 62 79 20 73 63  ws visited by sc
205c0 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  an */.    int iI
205d0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
205e0 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63  ectId;  /* Selec
205f0 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20  t id (left-most 
20600 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a  output column) *
20610 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72  /.    int isSear
20620 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
20630 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20640 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20  a SEARCH. False 
20650 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20  for SCAN. */..  
20660 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48 45    if( (flags&WHE
20670 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20  RE_MULTI_OR) || 
20680 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
20690 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
206a0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
206b0 69 73 53 65 61 72 63 68 20 3d 20 28 70 4c 65 76  isSearch = (pLev
206c0 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a  el->plan.nEq>0).
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
206e0 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
206f0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
20700 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
20710 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63            || (wc
20720 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45 5f  trlFlags&(WHERE_
20730 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52  ORDERBY_MIN|WHER
20740 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 29 3b  E_ORDERBY_MAX));
20750 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ..    zMsg = sql
20760 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
20770 22 25 73 22 2c 20 69 73 53 65 61 72 63 68 3f 22  "%s", isSearch?"
20780 53 45 41 52 43 48 22 3a 22 53 43 41 4e 22 29 3b  SEARCH":"SCAN");
20790 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
207a0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
207b0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
207c0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
207d0 2c 20 22 25 73 20 53 55 42 51 55 45 52 59 20 25  , "%s SUBQUERY %
207e0 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e  d", zMsg,pItem->
207f0 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
20800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4d 73  }else{.      zMs
20810 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
20820 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
20830 73 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 4d 73  s TABLE %s", zMs
20840 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  g, pItem->zName)
20850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
20860 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
20870 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
20880 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
20890 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20  b, zMsg, "%s AS 
208a0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
208b0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
208c0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
208d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
208e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  !=0 ){.      cha
208f0 72 20 2a 7a 57 68 65 72 65 20 3d 20 65 78 70 6c  r *zWhere = expl
20900 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 64 62  ainIndexRange(db
20910 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74 65 6d 2d  , pLevel, pItem-
20920 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 4d  >pTab);.      zM
20930 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
20940 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
20950 25 73 20 55 53 49 4e 47 20 25 73 25 73 49 4e 44  %s USING %s%sIND
20960 45 58 25 73 25 73 25 73 22 2c 20 7a 4d 73 67 2c  EX%s%s%s", zMsg,
20970 20 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c   .          ((fl
20980 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
20990 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f 4d 41 54  _INDEX)?"AUTOMAT
209a0 49 43 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20  IC ":""),.      
209b0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
209c0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3f 22 43  ERE_IDX_ONLY)?"C
209d0 4f 56 45 52 49 4e 47 20 22 3a 22 22 29 2c 0a 20  OVERING ":""),. 
209e0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
209f0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
20a00 44 45 58 29 3f 22 22 3a 22 20 22 29 2c 0a 20 20  DEX)?"":" "),.  
20a10 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
20a20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
20a30 45 58 29 3f 22 22 3a 20 70 4c 65 76 65 6c 2d 3e  EX)?"": pLevel->
20a40 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
20a50 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  me),.          z
20a60 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  Where.      );. 
20a70 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
20a80 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a  ee(db, zWhere);.
20a90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
20aa0 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
20ab0 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
20ac0 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
20ad0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
20ae0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
20af0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
20b00 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
20b10 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
20b20 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
20b30 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20  _ROWID_EQ ){.   
20b40 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
20b50 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
20b60 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
20b70 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  =?)", zMsg);.   
20b80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
20b90 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
20ba0 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
20bb0 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
20bc0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
20bd0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
20be0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
20bf0 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20   AND rowid<?)", 
20c00 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
20c10 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45  se if( flags&WHE
20c20 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
20c30 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
20c40 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
20c50 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
20c60 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid>?)", zMsg);.
20c70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20c80 66 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f  flags&WHERE_TOP_
20c90 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
20ca0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
20cb0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
20cc0 2c 20 22 25 73 20 28 72 6f 77 69 64 3c 3f 29 22  , "%s (rowid<?)"
20cd0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
20ce0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
20cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
20d00 41 4c 54 41 42 4c 45 0a 20 20 20 20 65 6c 73 65  ALTABLE.    else
20d10 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
20d20 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
20d30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
20d40 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
20d50 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65   *pVtabIdx = pLe
20d60 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  vel->plan.u.pVta
20d70 62 49 64 78 3b 0a 20 20 20 20 20 20 7a 4d 73 67  bIdx;.      zMsg
20d80 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
20d90 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
20da0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
20db0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
20dc0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
20dd0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 69       pVtabIdx->i
20de0 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78 2d  dxNum, pVtabIdx-
20df0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  >idxStr);.    }.
20e00 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77  #endif.    if( w
20e10 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45 52 45  ctrlFlags&(WHERE
20e20 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57 48 45  _ORDERBY_MIN|WHE
20e30 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 29 20  RE_ORDERBY_MAX) 
20e40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
20e50 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20  e( wctrlFlags & 
20e60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
20e70 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 20  N );.      nRow 
20e80 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
20e90 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 28 73 71        nRow = (sq
20ea0 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 4c 65 76  lite3_int64)pLev
20eb0 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20  el->plan.nRow;. 
20ec0 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67 20 3d 20     }.    zMsg = 
20ed0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
20ee0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 7e  db, zMsg, "%s (~
20ef0 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20 7a 4d 73  %lld rows)", zMs
20f00 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 73 71  g, nRow);.    sq
20f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20f20 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
20f30 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f  Id, iLevel, iFro
20f40 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  m, zMsg, P4_DYNA
20f50 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
20f60 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
20f70 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c  inOneScan(u,v,w,
20f80 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
20f90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
20fa0 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  LAIN */.../*.** 
20fb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
20fc0 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
20fd0 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f  he iLevel-th loo
20fe0 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  p in the WHERE c
20ff0 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  lause.** impleme
21000 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ntation describe
21010 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a  d by pWInfo..*/.
21020 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63  static Bitmask c
21030 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
21040 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
21050 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c  Info,   /* Compl
21060 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ete information 
21070 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
21080 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
21090 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
210a0 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c 20   /* Which level 
210b0 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73  of pWInfo->a[] s
210c0 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20 2a  hould be coded *
210d0 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
210e0 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  gs,      /* One 
210f0 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66  of the WHERE_* f
21100 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20  lags defined in 
21110 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 20  sqliteInt.h */. 
21120 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
21130 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
21140 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
21150 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
21160 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
21170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21180 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
21190 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
211a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
211b0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
211c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
211d0 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
211e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
211f0 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
21200 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
21210 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
21220 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
21230 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
21240 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
21250 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
21260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21270 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
21280 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
21290 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
212a0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
212b0 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
212c0 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
212d0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
212e0 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d  pWC;    /* Decom
212f0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
21300 65 6e 74 69 72 65 20 57 48 45 52 45 20 63 6c 61  entire WHERE cla
21310 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
21320 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
21330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48           /* A WH
21340 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
21350 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
21360 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
21370 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
21380 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56 64 62  context */.  Vdb
21390 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213b0 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 6d  The prepared stm
213c0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
213d0 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63  tions */.  struc
213e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
213f0 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52  pTabItem;  /* FR
21400 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62  OM clause term b
21410 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
21420 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20  int addrBrk;    
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21440 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
21450 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
21460 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
21470 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20  ddrCont;        
21480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
21490 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
214a0 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63 79  nue with next cy
214b0 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  cle */.  int iRo
214c0 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20  widReg = 0;     
214d0 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73     /* Rowid is s
214e0 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72 65  tored in this re
214f0 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a  gister, if not z
21500 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ero */.  int iRe
21510 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20  leaseReg = 0;   
21520 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
21530 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f  ter to free befo
21540 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a  re returning */.
21550 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e  .  pParse = pWIn
21560 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76 20  fo->pParse;.  v 
21570 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
21580 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66 6f 2d  .  pWC = pWInfo-
21590 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  >pWC;.  pLevel =
215a0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76   &pWInfo->a[iLev
215b0 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  el];.  pTabItem 
215c0 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  = &pWInfo->pTabL
215d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
215e0 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20  From];.  iCur = 
215f0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
21600 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70 4c 65  r;.  bRev = (pLe
21610 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
21620 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
21630 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54 61 62  E)!=0;.  omitTab
21640 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  le = (pLevel->pl
21650 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
21660 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20  RE_IDX_ONLY)!=0 
21670 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
21680 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
21690 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d  RE_FORCE_TABLE)=
216a0 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  =0;..  /* Create
216b0 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
216c0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
216d0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
216e0 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
216f0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
21700 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
21710 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
21720 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
21730 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
21740 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
21750 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
21760 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
21770 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
21780 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
21790 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
217a0 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
217b0 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
217c0 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
217d0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
217e0 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
217f0 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
21800 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
21810 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
21820 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
21830 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
21840 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
21850 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
21860 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
21870 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
21880 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
21890 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
218a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
218b0 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
218c0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
218d0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
218e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
218f0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
21900 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
21910 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
21920 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
21930 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
21940 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
21950 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
21960 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
21970 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
21980 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
21990 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
219a0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
219b0 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
219c0 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
219d0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
219e0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
219f0 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
21a00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
21a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21a20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
21a30 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
21a40 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
21a50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
21a60 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
21a70 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
21a80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21a90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
21aa0 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 65 76  BLE.  if(  (pLev
21ab0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
21ac0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
21ad0 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20  TABLE)!=0 ){.   
21ae0 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65   /* Case 0:  The
21af0 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
21b00 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
21b10 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
21b20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20 20  VNext.    **    
21b30 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
21b40 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  the data..    */
21b50 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20  .    int iReg;  
21b60 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
21b70 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
21b80 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
21b90 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20  _info *pVtabIdx 
21ba0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
21bb0 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20 69  .pVtabIdx;.    i
21bc0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
21bd0 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f 6e 73   pVtabIdx->nCons
21be0 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74 72 75  traint;.    stru
21bf0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
21c00 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
21c10 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20  e *aUsage =.    
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
21c50 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  bIdx->aConstrain
21c60 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f 6e 73  tUsage;.    cons
21c70 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
21c80 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
21c90 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  t *aConstraint =
21ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73   pVtabIdx->aCons
21ce0 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 73 71 6c  traint;..    sql
21cf0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
21d00 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  h(pParse);.    i
21d10 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
21d20 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
21d30 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
21d40 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
21d50 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  <=nConstraint; j
21d60 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ++){.      for(k
21d70 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; k<nConstrain
21d80 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; k++){.       
21d90 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61   if( aUsage[k].a
21da0 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20  rgvIndex==j ){. 
21db0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65           int iTe
21dc0 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
21dd0 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [k].iTermOffset;
21de0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21df0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
21e00 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e, pWC->a[iTerm]
21e10 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  .pExpr->pRight, 
21e20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20  iReg+j+1);.     
21e30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21e40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21e50 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
21e60 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
21e70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21e80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21e90 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62  P_Integer, pVtab
21ea0 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65  Idx->idxNum, iRe
21eb0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
21ec0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21ed0 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
21ee0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
21ef0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21f00 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
21f10 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c  , addrBrk, iReg,
21f20 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
21f30 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
21f40 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
21f50 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
21f60 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
21f70 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
21f80 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
21f90 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
21fa0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
21fb0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
21fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
21fd0 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
21fe0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65  .        int iTe
21ff0 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
22000 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [j].iTermOffset;
22010 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
22020 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57  Term(pLevel, &pW
22030 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20  C->a[iTerm]);.  
22040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22050 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
22060 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
22070 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
22080 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
22090 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
220a0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
220b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
220c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
220d0 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
220e0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  2);.    sqlite3E
220f0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
22100 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a  se, 1);.  }else.
22110 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22120 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22130 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 65  LE */..  if( pLe
22140 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
22150 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
22160 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  EQ ){.    /* Cas
22170 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72  e 1:  We can dir
22180 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20  ectly reference 
22190 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69  a single row usi
221a0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ng an.    **    
221b0 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63        equality c
221c0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
221d0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
221e0 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20  d.  Or.    **   
221f0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
22200 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
22210 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
22220 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a   IN (...)".    *
22230 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
22240 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ruct..    */.   
22250 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
22260 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
22270 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 54  (pParse);.    pT
22280 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
22290 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
222a0 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
222b0 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  _IN, 0);.    ass
222c0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
222d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
222e0 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
222f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
22300 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
22310 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Cur );.    asser
22320 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
22330 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
22340 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
22350 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
22360 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
22370 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 69 52  -11662 */.    iR
22380 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65 45 71  owidReg = codeEq
22390 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
223a0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
223b0 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
223c0 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
223d0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20  evel->addrNxt;. 
223e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
223f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
22400 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c  eInt, iRowidReg,
22410 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 73   addrNxt);.    s
22420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
22430 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
22440 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
22450 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
22460 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
22470 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
22480 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
22490 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  eg);.    VdbeCom
224a0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
224b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
224c0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c  = OP_Noop;.  }el
224d0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
224e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
224f0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
22500 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
22510 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
22520 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
22530 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
22540 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
22550 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
22560 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
22570 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
22580 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
22590 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
225a0 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
225b0 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
225c0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
225d0 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69  .    pStart = fi
225e0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
225f0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
22600 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
22610 0a 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64  .    pEnd = find
22620 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
22630 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
22640 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20  _LT|WO_LE, 0);. 
22650 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
22660 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
22670 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
22680 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
22690 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
226a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
226b0 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
226c0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
226d0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
226e0 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
226f0 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
22700 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
22710 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
22720 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
22730 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
22740 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
22750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
22760 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
22770 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
22780 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
22790 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
227a0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
227b0 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
227c0 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
227d0 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
227e0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
227f0 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
22800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
22810 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
22820 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
22830 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
22840 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
22850 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
22860 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
22870 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
22880 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
22890 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
228a0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
228b0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
228c0 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
228d0 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
228e0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
228f0 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
22900 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
22910 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
22920 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
22930 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
22940 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
22950 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
22960 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74     testcase( pSt
22970 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
22980 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
22990 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
229a0 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 70 58 20  662 */.      pX 
229b0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
229c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
229d0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
229e0 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
229f0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
22a00 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
22a10 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
22a20 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
22a30 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
22a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22a50 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
22a60 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
22a70 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
22a80 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
22a90 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
22aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22ab0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
22ac0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
22ad0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
22ae0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22af0 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
22b00 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
22b10 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
22b20 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
22b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22b40 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
22b50 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
22b60 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
22b70 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
22b80 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
22b90 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
22ba0 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
22bb0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
22bc0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
22bd0 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
22be0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
22bf0 72 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r );.      testc
22c00 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c 61  ase( pEnd->wtFla
22c10 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
22c20 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
22c30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
22c40 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d     memEndValue =
22c50 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22c70 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22c80 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d 45 6e  X->pRight, memEn
22c90 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  dValue);.      i
22ca0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
22cb0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
22cc0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  T ){.        tes
22cd0 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
22ce0 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20  Le : OP_Ge;.    
22cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22d00 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
22d10 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
22d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 69        }.      di
22d30 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
22d40 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20  , pEnd);.    }. 
22d50 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
22d60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
22d70 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  r(v);.    pLevel
22d80 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
22d90 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
22da0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
22db0 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
22dc0 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
22dd0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 3d 3d      if( pStart==
22de0 30 20 26 26 20 70 45 6e 64 3d 3d 30 20 29 7b 0a  0 && pEnd==0 ){.
22df0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
22e00 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
22e10 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
22e20 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
22e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
22e40 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
22e50 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74    }.    if( test
22e60 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  Op!=OP_Noop ){. 
22e70 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d       iRowidReg =
22e80 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73   iReleaseReg = s
22e90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
22ea0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22ec0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
22ed0 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
22ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22ef0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
22f00 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
22f10 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
22f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22f30 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65  p3(v, testOp, me
22f40 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64 72 42  mEndValue, addrB
22f50 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  rk, iRowidReg);.
22f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22f70 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
22f80 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
22f90 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
22fa0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ULL);.    }.  }e
22fb0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
22fc0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28  plan.wsFlags & (
22fd0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
22fe0 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
22ff0 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  EQ) ){.    /* Ca
23000 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73 69  se 3: A scan usi
23010 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  ng an index..   
23020 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
23030 20 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61     The WHERE cla
23040 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  use may contain 
23050 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75  zero or more equ
23060 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20  ality .    **   
23070 20 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d        terms ("==
23080 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
23090 6f 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20  ors) that refer 
230a0 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20  to the N.    ** 
230b0 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
230c0 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
230d0 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
230e0 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
230f0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75  **         inequ
23100 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
23110 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c  s (>, <, >= or <
23120 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65  =) on the indexe
23130 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  d.    **        
23140 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d   column that imm
23150 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
23160 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65   the N equalitie
23170 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20  s. Only .    ** 
23180 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
23190 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
231a0 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
231b0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
231c0 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  st.    **       
231d0 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61    use the "==" a
231e0 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  nd "IN" operator
231f0 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
23200 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  if the .    **  
23210 20 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20         index is 
23220 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e  on (x,y,z), then
23230 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
23240 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a  lauses are all .
23250 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f      **         o
23260 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a  ptimized:.    **
23270 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23280 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20     x=5.    **   
23290 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
232a0 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y=10.    **    
232b0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
232c0 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y<10.    **     
232d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
232e0 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
232f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
23300 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c  5 AND y=5 AND z<
23310 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  =10.    **.    *
23320 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c  *         The z<
23330 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  10 term of the f
23340 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20  ollowing cannot 
23350 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20  be used, only.  
23360 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
23370 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a   x=5 term:.    *
23380 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
23390 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30      x=5 AND z<10
233a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
233b0 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
233c0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
233d0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
233e0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a  straints..    **
233f0 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72           If ther
23400 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c  e are no inequal
23410 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
23420 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20   then N is at.  
23430 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61    **         lea
23440 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  st one..    **. 
23450 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
23460 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20  is case is also 
23470 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  used when there 
23480 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
23490 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  use.    **      
234a0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
234b0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
234c0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
234d0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  in order.    ** 
234e0 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
234f0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
23500 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
23510 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
23520 20 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63   */  .    static
23530 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
23540 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  Op[] = {.      0
23550 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  ,.      0,.     
23560 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
23570 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74        /* 2: (!st
23580 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
23590 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21  && startEq &&  !
235a0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
235b0 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  P_Last,         
235c0 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72      /* 3: (!star
235d0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
235e0 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52   startEq &&   bR
235f0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
23600 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20  SeekGt,         
23610 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63    /* 4: (start_c
23620 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21  onstraints  && !
23630 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
23640 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
23650 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekLt,           
23660 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 5: (start_con
23670 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
23680 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
23690 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
236a0 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Ge,           /*
236b0 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   6: (start_const
236c0 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72  raints  &&  star
236d0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
236e0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65  .      OP_SeekLe
236f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37              /* 7
23700 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
23710 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
23720 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
23730 20 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63     };.    static
23740 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70   const u8 aEndOp
23750 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f  [] = {.      OP_
23760 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Noop,           
23770 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f    /* 0: (!end_co
23780 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20  nstraints) */.  
23790 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
237a0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
237b0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
237c0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
237d0 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20     OP_IdxLT     
237e0 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65          /* 2: (e
237f0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
23800 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d  & bRev) */.    }
23810 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20  ;.    int nEq = 
23820 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71  pLevel->plan.nEq
23830 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
23840 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a  == or IN terms *
23850 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  /.    int isMinQ
23860 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
23870 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
23880 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 53 45   an optimized SE
23890 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f  LECT min(x).. */
238a0 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65  .    int regBase
238b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
238c0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
238d0 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
238e0 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
238f0 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20      int r1;     
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
23920 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  r */.    WhereTe
23930 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
23940 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
23950 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
23960 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
23970 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
23980 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
23990 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
239a0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
239b0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
239c0 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
239d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
239e0 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
239f0 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
23a00 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
23a10 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
23a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23a30 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
23a40 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
23a50 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
23a60 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
23a70 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
23a80 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
23a90 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
23aa0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
23ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23ac0 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
23ad0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
23ae0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
23af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23b00 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
23b10 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
23b20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b40 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
23b50 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
23b60 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
23b70 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
23b80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
23b90 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
23ba0 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
23bb0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
23bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
23bd0 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
23be0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
23bf0 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
23c00 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
23c10 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
23c20 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
23c30 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 41  .    char *zEndA
23c40 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
23c50 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
23c60 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
23c70 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
23c80 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
23c90 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
23ca0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
23cb0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
23cc0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
23cd0 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a  umn[nEq];     /*
23ce0 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71   Column for ineq
23cf0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
23d00 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ts */..    /* If
23d10 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
23d20 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
23d30 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
23d40 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
23d50 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
23d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
23d70 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
23d80 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
23d90 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
23da0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
23db0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
23dc0 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
23dd0 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
23de0 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
23df0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
23e00 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
23e10 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
23e20 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
23e30 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
23e40 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
23e50 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
23e60 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
23e70 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
23e80 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
23e90 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
23ea0 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
23eb0 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
23ec0 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
23ed0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
23ee0 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
23ef0 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
23f00 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    && (pLevel->pl
23f10 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
23f20 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26  _ORDERBY).     &
23f30 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
23f40 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
23f50 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
23f60 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
23f70 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
23f80 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
23f90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
23fa0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
23fb0 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
23fc0 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
23fd0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
23fe0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
23ff0 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
24000 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
24010 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
24020 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
24030 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
24040 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
24050 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
24060 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24070 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
24080 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
24090 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  eEnd = findTerm(
240a0 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
240b0 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57  tReady, (WO_LT|W
240c0 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_LE), pIdx);.  
240d0 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
240e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
240f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
24100 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
24110 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
24120 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
24130 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
24140 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
24150 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
24160 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  Idx);.      nExt
24170 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
24180 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
24190 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
241a0 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
241b0 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
241c0 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
241d0 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
241e0 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
241f0 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
24200 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
24210 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
24220 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
24230 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
24240 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
24250 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
24260 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e  , pLevel, pWC, n
24270 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52  otReady, nExtraR
24280 65 67 2c 20 26 7a 53 74 61 72 74 41 66 66 0a 20  eg, &zStartAff. 
24290 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e 64 41 66     );.    zEndAf
242a0 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  f = sqlite3DbStr
242b0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
242c0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
242d0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
242e0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
242f0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
24300 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
24310 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
24320 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
24330 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
24340 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
24350 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
24360 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
24370 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
24380 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
24390 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
243a0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
243b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71    */.    if( nEq
243c0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pIdx->nColumn &
243d0 26 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  & bRev==(pIdx->a
243e0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
243f0 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
24400 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
24410 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
24420 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
24430 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
24440 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
24450 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
24460 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
24470 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
24480 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
24490 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
244a0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
244b0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
244c0 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
244d0 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
244e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
244f0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24500 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
24510 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
24520 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
24530 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
24540 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
24550 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
24560 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
24570 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
24580 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
24590 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
245a0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
245b0 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
245c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
245d0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
245e0 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
245f0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
24600 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
24610 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
24620 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
24630 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
24640 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
24650 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
24660 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
24670 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
24680 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24690 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
246a0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
246b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
246c0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
246d0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
246e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
246f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73  qlite3ExprCodeIs
24700 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67  NullJump(v, pRig
24710 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ht, regBase+nEq,
24720 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
24730 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74   }.      if( zSt
24740 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20  artAff ){.      
24750 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d    if( sqlite3Com
24760 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69  pareAffinity(pRi
24770 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
24780 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  Eq])==SQLITE_AFF
24790 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
247a0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
247b0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
247c0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
247d0 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
247e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
247f0 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
24800 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
24810 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
24820 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
24830 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
24840 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
24850 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
24860 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
24870 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
24880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
24890 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  f( sqlite3ExprNe
248a0 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
248b0 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61  nge(pRight, zSta
248c0 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20  rtAff[nEq]) ){. 
248d0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
248e0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
248f0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
24900 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20     }.      }  . 
24910 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
24920 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
24930 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d  se( pRangeStart-
24940 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24950 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
24960 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
24970 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
24980 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
24990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
249a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
249b0 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
249c0 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
249d0 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
249e0 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
249f0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
24a00 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
24a10 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
24a20 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
24a30 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
24a40 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  t, zStartAff);. 
24a50 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
24a60 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
24a70 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
24a80 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
24a90 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
24aa0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
24ab0 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
24ac0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
24ad0 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
24ae0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
24af0 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
24b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
24b10 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
24b20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
24b30 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
24b40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
24b50 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
24b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24b70 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
24b80 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
24b90 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
24ba0 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
24bb0 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
24bc0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
24bd0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
24be0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
24bf0 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
24c00 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
24c10 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
24c20 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
24c30 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
24c40 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
24c50 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
24c60 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
24c70 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
24c80 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
24c90 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20  se+nEq, 1);.    
24ca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24cb0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
24cc0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
24cd0 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67        if( (pRang
24ce0 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
24cf0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
24d00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24d10 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
24d20 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
24d30 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
24d40 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Nxt);.      }.  
24d50 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20      if( zEndAff 
24d60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
24d70 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
24d80 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45  inity(pRight, zE
24d90 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c  ndAff[nEq])==SQL
24da0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20  ITE_AFF_NONE){. 
24db0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63           /* Sinc
24dc0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
24dd0 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
24de0 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
24df0 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  ersions.        
24e00 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20    ** applied to 
24e10 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65  the operands, se
24e20 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
24e30 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68  o apply to pRigh
24e40 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20  t to .          
24e50 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
24e60 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  NE.  */.        
24e70 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
24e80 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
24e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
24eb0 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
24ec0 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c  tyChange(pRight,
24ed0 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29   zEndAff[nEq]) )
24ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  {.          zEnd
24ef0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
24f00 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
24f10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
24f20 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41        codeApplyA
24f30 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
24f40 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20  regBase, nEq+1, 
24f50 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20  zEndAff);.      
24f60 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
24f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24f80 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67  RangeEnd->wtFlag
24f90 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24fa0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
24fb0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
24fc0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
24fd0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
24fe0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
24ff0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
25000 61 72 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66  arse->db, zEndAf
25010 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20  f);..    /* Top 
25020 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
25030 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
25040 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
25050 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
25060 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
25070 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
25080 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
25090 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
250a0 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64  */.    op = aEnd
250b0 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c  Op[(pRangeEnd ||
250c0 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65   nEq) * (1 + bRe
250d0 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73  v)];.    testcas
250e0 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29  e( op==OP_Noop )
250f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
25100 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
25110 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
25120 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20  ==OP_IdxLT );.  
25130 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f    if( op!=OP_Noo
25140 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
25150 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
25160 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
25170 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
25180 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
25190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
251a0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
251b0 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a  Eq!=bRev ?1:0);.
251c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
251d0 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75   there are inequ
251e0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
251f0 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  s, check that th
25200 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  e value.    ** o
25210 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
25220 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71  mn that the ineq
25230 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73  uality contrains
25240 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
25250 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a    ** If it is, j
25260 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
25270 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
25280 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
25290 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
252a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
252b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
252c0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
252d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
252e0 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65  _LIMIT );.    te
252f0 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
25300 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
25310 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
25320 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
25330 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25340 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
25350 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
25360 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
25370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25380 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
25390 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
253a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
253b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
253c0 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
253d0 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
253e0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
253f0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
25400 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
25410 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
25420 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
25430 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
25440 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
25450 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
25460 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
25470 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
25480 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
25490 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
254a0 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
254b0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
254c0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
254d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
254e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
254f0 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
25500 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
25510 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
25520 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
25530 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
25540 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
25550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25560 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
25570 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
25580 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
25590 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
255a0 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
255b0 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
255c0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
255d0 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
255e0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
255f0 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
25600 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
25610 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
25620 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
25630 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
25640 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
25650 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
25660 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65  iIdxCur;.  }else
25670 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25680 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
25690 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76  ATION.  if( pLev
256a0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
256b0 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
256c0 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
256d0 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   4:  Two or more
256e0 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
256f0 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
25700 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
25710 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
25720 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
25730 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
25740 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
25750 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
25760 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
25770 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
25780 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
25790 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
257a0 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
257b0 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
257c0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
257d0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
257e0 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
257f0 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
25800 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
25810 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
25820 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
25830 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
25840 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
25850 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
25860 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
25870 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
25880 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
25890 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
258a0 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
258b0 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
258c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
258d0 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
258e0 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
258f0 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
25900 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
25910 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
25920 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
25930 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
25940 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
25950 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
25960 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
25970 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
25980 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
25990 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
259a0 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
259b0 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
259c0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
259d0 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
259e0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
259f0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
25a00 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
25a10 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
25a20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
25a40 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
25a50 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
25a60 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
25a70 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
25a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25a90 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
25aa0 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
25ab0 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
25ac0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
25ad0 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
25ae0 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
25af0 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
25b00 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
25b10 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
25b20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
25b30 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
25b40 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
25b50 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
25b60 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
25b70 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
25b80 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
25b90 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bb0 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
25bc0 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
25bd0 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
25be0 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
25bf0 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
25c00 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
25c10 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
25c20 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
25c30 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
25c40 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
25c50 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
25c60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
25c70 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
25c80 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
25c90 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
25ca0 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
25cb0 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
25cc0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
25cd0 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
25ce0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69    WhereTerm *pFi
25cf0 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69 6e 61  nal;     /* Fina
25d00 6c 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e  l subterm within
25d10 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 2e 20   the OR-clause. 
25d20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
25d30 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
25d40 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
25d50 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
25d60 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
25d70 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74  ..    int regRet
25d80 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
25d90 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
25da0 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64  /* Register used
25db0 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a   with OP_Gosub *
25dc0 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
25dd0 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25df0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
25e00 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f  RowSet object */
25e10 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
25e20 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e40 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
25e50 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ng rowid */.    
25e60 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20  int iLoopBody = 
25e70 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
25e80 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61  abel(v);  /* Sta
25e90 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20  rt of loop body 
25ea0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49  */.    int iRetI
25eb0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
25ee0 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f  egReturn init */
25ef0 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65  .    int unteste
25f00 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20  dTerms = 0;     
25f10 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20          /* Some 
25f20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  terms not comple
25f30 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20  tely tested */. 
25f40 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a 20     int ii;.   . 
25f50 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65     pTerm = pLeve
25f60 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b  l->plan.u.pTerm;
25f70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
25f80 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
25f90 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
25fa0 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a  rator==WO_OR );.
25fb0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
25fc0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
25fd0 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
25fe0 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
25ff0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
26000 77 63 3b 0a 20 20 20 20 70 46 69 6e 61 6c 20 3d  wc;.    pFinal =
26010 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 57 63   &pOrWc->a[pOrWc
26020 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a 20 20 20 20  ->nTerm-1];.    
26030 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
26040 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
26050 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
26060 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
26070 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
26080 20 6e 69 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   ni pOrTab conta
26090 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
260a0 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
260b0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
260c0 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
260d0 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
260e0 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
260f0 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
26100 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
26110 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
26120 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
26130 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
26140 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
26150 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
26160 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
26170 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
26180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26190 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
261a0 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
261b0 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
261c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
261d0 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
261e0 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
261f0 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
26200 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
26210 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
26220 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
26230 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
26240 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70  3StackAllocRaw(p
26250 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26270 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
26280 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64  OrTab)+ nNotRead
26290 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  y*sizeof(pOrTab-
262a0 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69  >a[0]));.      i
262b0 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72  f( pOrTab==0 ) r
262c0 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
262d0 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41        pOrTab->nA
262e0 6c 6c 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f  lloc = (i16)(nNo
262f0 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
26300 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
26310 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
26320 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
26330 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
26340 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
26350 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
26360 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
26370 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
26380 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
26390 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
263a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
263b0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
263c0 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
263d0 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
263e0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
263f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26400 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
26410 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
26420 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
26430 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
26440 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
26450 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
26460 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
26470 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
26480 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
26490 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
264a0 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
264b0 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
264c0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
264d0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
264e0 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
264f0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
26500 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
26510 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
26520 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
26530 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
26540 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
26550 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
26560 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
26570 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
26580 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
26590 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
265a0 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
265b0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
265c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
265d0 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
265e0 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
265f0 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
26600 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
26610 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
26620 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
26630 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
26640 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
26650 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
26660 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
26670 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
26680 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
26690 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
266a0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
266b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ==0 ){.      reg
266c0 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Rowset = ++pPars
266d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
266e0 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
266f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
26700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26710 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
26720 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20   regRowset);.   
26730 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20   }.    iRetInit 
26740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26750 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
26760 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29  r, 0, regReturn)
26770 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
26780 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d   ii<pOrWc->nTerm
26790 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57  ; ii++){.      W
267a0 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
267b0 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69  m = &pOrWc->a[ii
267c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ];.      if( pOr
267d0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
267e0 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72  ==iCur || pOrTer
267f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
26800 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _AND ){.        
26810 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57  WhereInfo *pSubW
26820 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
26830 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
26840 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
26850 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  /.        /* Loo
26860 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
26870 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
26880 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
26890 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62   */.        pSub
268a0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
268b0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
268c0 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 54 65 72  , pOrTab, pOrTer
268d0 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20 20 20  m->pExpr, 0,.   
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f       WHERE_OMIT_
26900 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49  OPEN | WHERE_OMI
26910 54 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  T_CLOSE |.      
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41    WHERE_FORCE_TA
26940 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54  BLE | WHERE_ONET
26950 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  ABLE_ONLY);.    
26960 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
26970 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  o ){.          e
26980 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
269a0 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53  rse, pOrTab, &pS
269b0 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69  ubWInfo->a[0], i
269c0 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69  Level, pLevel->i
269d0 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20  From, 0.        
269e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
269f0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
26a00 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
26a10 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
26a20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74          int iSet
26a30 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e   = ((ii==pOrWc->
26a40 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b  nTerm-1)?-1:ii);
26a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
26a60 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   r;.            
26a70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
26a80 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
26a90 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70  rse, pTabItem->p
26aa0 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a  Tab, -1, iCur, .
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69           regRowi
26ae0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26b00 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65  4Int(v, OP_RowSe
26b10 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74  tTest, regRowset
26b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
26b50 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
26b60 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20  r, iSet);.      
26b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26b90 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
26ba0 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42  egReturn, iLoopB
26bb0 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ody);..         
26bc0 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66   /* The pSubWInf
26bd0 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73  o->untestedTerms
26be0 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74   flag means that
26bf0 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20   this OR term.  
26c00 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
26c10 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ined one or more
26c20 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61   AND term from a
26c30 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e   notReady table.
26c40 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20    The.          
26c50 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ** terms from th
26c60 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  e notReady table
26c70 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65   could not be te
26c80 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20  sted and will.  
26c90 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
26ca0 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74  to be tested lat
26cb0 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  er..          */
26cc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26cd0 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  SubWInfo->untest
26ce0 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74  edTerms ) untest
26cf0 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20  edTerms = 1;..  
26d00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
26d10 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75  h the loop throu
26d20 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
26d30 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
26d40 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
26d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
26d60 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f  ereEnd(pSubWInfo
26d70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
26d90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
26da0 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20  P1(v, iRetInit, 
26db0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
26dc0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
26dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26de0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
26df0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
26e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26e10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26e20 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
26e30 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
26e40 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65  Level>1 ) sqlite
26e50 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73  3StackFree(pPars
26e60 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a  e->db, pOrTab);.
26e70 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65      if( !unteste
26e80 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65  dTerms ) disable
26e90 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
26ea0 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rm);.  }else.#en
26eb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
26ec0 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
26ed0 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f  ON */..  {.    /
26ee0 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65  * Case 5:  There
26ef0 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e   is no usable in
26f00 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f  dex.  We must do
26f10 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20   a complete.    
26f20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
26f30 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
26f40 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
26f50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
26f60 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f   aStep[] = { OP_
26f70 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b  Next, OP_Prev };
26f80 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
26f90 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20  t u8 aStart[] = 
26fa0 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f  { OP_Rewind, OP_
26fb0 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65  Last };.    asse
26fc0 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62  rt( bRev==0 || b
26fd0 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  Rev==1 );.    as
26fe0 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
26ff0 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 );.    pLevel
27000 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65  ->op = aStep[bRe
27010 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  v];.    pLevel->
27020 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
27030 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
27040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27050 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76  2(v, aStart[bRev
27060 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
27070 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
27080 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
27090 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
270a0 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65  TEP;.  }.  notRe
270b0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
270c0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
270d0 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65  Cur);..  /* Inse
270e0 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
270f0 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
27100 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
27110 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
27120 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
27130 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
27140 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  f tables..  **. 
27150 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49   ** IMPLEMENTATI
27160 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35  ON-OF: R-49525-5
27170 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20  0935 Terms that 
27180 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66  cannot be satisf
27190 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ied through.  **
271a0 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69   the use of indi
271b0 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73  ces become tests
271c0 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61   that are evalua
271d0 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68  ted against each
271e0 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65   row of.  ** the
271f0 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20   relevant input 
27200 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b  tables..  */.  k
27210 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
27220 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
27230 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
27240 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
27250 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
27260 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
27270 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
27280 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a  RTUAL ); /* IMP:
27290 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
272a0 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
272b0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
272c0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
272d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
272e0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
272f0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
27300 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
27310 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
27320 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
27330 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
27340 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
27350 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
27360 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
27370 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
27380 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27390 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
273a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
273b0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
273c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
273d0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
273e0 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
273f0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
27400 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
27410 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
27420 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
27430 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
27440 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
27450 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
27460 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27470 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27480 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
27490 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
274a0 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20  ;.    k = 1;.   
274b0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
274c0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
274d0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
274e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
274f0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
27500 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
27510 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
27520 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
27530 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
27540 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
27550 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
27560 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
27570 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
27580 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
27590 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
275a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
275b0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
275c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
275d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
275e0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
275f0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
27600 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
27610 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
27620 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27630 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27640 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
27650 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
27660 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
27670 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
27680 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
27690 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
276a0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a  M_VIRTUAL );  /*
276b0 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31   IMP: R-30575-11
276c0 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  662 */.      tes
276d0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
276e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
276f0 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
27700 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
27710 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
27720 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
27730 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
27740 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
27750 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
27760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
27770 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74  ert( pWInfo->unt
27780 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20  estedTerms );.  
27790 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
277a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
277b0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
277c0 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr );.      sqli
277d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
277e0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
277f0 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  xpr, addrCont, S
27800 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27810 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  );.      pTerm->
27820 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
27830 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  CODED;.    }.  }
27840 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
27850 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
27860 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a   iReleaseReg);..
27870 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64    return notRead
27880 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  y;.}..#if define
27890 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
278a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
278b0 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64  ng variable hold
278c0 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70  s a text descrip
278d0 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c  tion of query pl
278e0 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  an generated.** 
278f0 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
27900 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
27910 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20  e3WhereBegin(). 
27920 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68   Each call to Wh
27930 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72  ereBegin.** over
27940 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
27950 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ous.  This infor
27960 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
27970 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a  or testing and.*
27980 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  * analysis only.
27990 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
279a0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a  _query_plan[BMS*
279b0 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20  2*40];  /* Text 
279c0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73  of the join */.s
279d0 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e  tatic int nQPlan
279e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
279f0 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20     /* Next free 
27a00 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70  slow in _query_p
27a10 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66  lan[] */..#endif
27a20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
27a30 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  */.../*.** Free 
27a40 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
27a50 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
27a60 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
27a70 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
27a80 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
27a90 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
27aa0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
27ab0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
27ac0 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
27ad0 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
27ae0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
27af0 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57  info *pInfo = pW
27b00 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49  Info->a[i].pIdxI
27b10 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
27b20 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
27b30 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f  /* assert( pInfo
27b40 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
27b50 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  tr==0 || db->mal
27b60 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a  locFailed ); */.
27b70 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66          if( pInf
27b80 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
27b90 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
27ba0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
27bb0 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
27bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27bd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27be0 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , pInfo);.      
27bf0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  }.      if( pWIn
27c00 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73  fo->a[i].plan.ws
27c10 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  Flags & WHERE_TE
27c20 4d 50 5f 49 4e 44 45 58 20 29 7b 0a 20 20 20 20  MP_INDEX ){.    
27c30 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
27c40 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70  = pWInfo->a[i].p
27c50 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20  lan.u.pIdx;.    
27c60 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a      if( pIdx ){.
27c70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
27c80 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
27c90 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
27ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
27cb0 72 65 65 28 64 62 2c 20 70 49 64 78 29 3b 0a 20  ree(db, pIdx);. 
27cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27cd0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65  .    }.    where
27ce0 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57 49 6e  ClauseClear(pWIn
27cf0 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20 73 71  fo->pWC);.    sq
27d00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27d10 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
27d20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
27d30 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
27d40 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
27d50 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
27d60 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
27d70 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
27d80 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
27d90 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
27da0 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
27db0 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
27dc0 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
27dd0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
27de0 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
27df0 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
27e00 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
27e10 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
27e20 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
27e30 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
27e40 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
27e50 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
27e60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
27e70 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
27e80 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27e90 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
27ea0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
27eb0 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
27ec0 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
27ed0 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
27ee0 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
27ef0 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
27f00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
27f10 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
27f20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
27f30 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
27f40 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
27f50 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
27f60 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
27f70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
27f80 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
27f90 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
27fa0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
27fb0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
27fc0 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
27fd0 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
27fe0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
27ff0 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
28000 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
28010 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
28020 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
28030 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
28040 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
28050 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
28060 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
28070 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
28080 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
28090 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
280a0 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
280b0 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
280c0 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
280d0 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
280f0 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
28100 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
28130 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
28140 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
28170 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
28180 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
28190 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
281a0 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
281b0 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
281c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
281d0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
281e0 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
281f0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
28200 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
28210 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
28220 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
28230 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
28240 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
28250 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
28260 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
28270 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
28280 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
28290 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
282a0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
282b0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
282c0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
282d0 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
282e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
282f0 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
28300 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
28310 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
28320 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
28330 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
28340 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
28350 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
28360 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
28370 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
28380 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
28390 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
283a0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
283b0 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
283c0 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
283d0 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
283e0 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
283f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
28400 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
28410 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
28420 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
28430 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
28440 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
28450 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
28460 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
28470 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
28480 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
28490 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
284a0 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
284b0 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
284c0 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
284d0 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
284e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
284f0 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
28500 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
28510 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
28520 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
28530 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
28540 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
28550 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
28560 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
28570 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
28580 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
28590 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
285a0 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
285b0 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
285c0 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
285d0 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
285e0 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
285f0 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
28600 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
28610 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
28620 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
28630 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
28640 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
28650 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
28660 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
28670 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
28680 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
28690 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
286a0 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
286b0 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
286c0 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
286d0 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
286e0 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
286f0 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
28700 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
28710 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
28720 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
28730 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
28740 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
28750 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
28760 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
28770 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
28780 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
28790 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
287a0 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
287b0 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
287c0 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
287d0 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
287e0 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
287f0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
28800 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
28810 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
28820 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
28830 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
28840 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
28850 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
28860 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
28870 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
28880 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
28890 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
288a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
288b0 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
288c0 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
288d0 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
288e0 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
288f0 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
28900 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
28910 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
28920 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
28930 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
28940 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
28950 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
28960 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
28970 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
28980 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
28990 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
289a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
289b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
289c0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
289d0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
289e0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
289f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
28a00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
28a10 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
28a20 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
28a30 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
28a40 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
28a50 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79  , then ppOrderBy
28a60 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
28a70 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  If an index can 
28a80 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20  be used so that 
28a90 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70  the natural outp
28aa0 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ut order of the 
28ab0 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73  table.** scan is
28ac0 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65   correct for the
28ad0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28ae0 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65  , then that inde
28af0 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a  x is used and.**
28b00 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73   *ppOrderBy is s
28b10 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  et to NULL.  Thi
28b20 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
28b30 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e  tion that preven
28b40 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73  ts an.** unneces
28b50 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65  sary sort of the
28b60 20 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61   result set if a
28b70 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69  n index appropri
28b80 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f  ate for the.** O
28b90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
28ba0 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a  lready exists..*
28bb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72  *.** If the wher
28bc0 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63  e clause loops c
28bd0 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65  annot be arrange
28be0 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
28bf0 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70   correct.** outp
28c00 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74  ut order, then t
28c10 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  he *ppOrderBy is
28c20 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57   unchanged..*/.W
28c30 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
28c40 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
28c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
28c60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
28c70 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
28c80 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
28c90 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
28ca0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
28cb0 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
28cc0 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
28cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
28ce0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
28cf0 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64  ExprList **ppOrd
28d00 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45  erBy, /* An ORDE
28d10 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
28d20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20 77 63  NULL */.  u16 wc
28d30 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
28d40 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
28d50 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
28d60 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
28d70 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  .h */.){.  int i
28d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28da0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
28db0 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20  ByteWInfo;      
28dc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79        /* Num. by
28dd0 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
28de0 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  r WhereInfo stru
28df0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62  ct */.  int nTab
28e00 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
28e10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28e20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62  elements in pTab
28e30 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  List */.  WhereI
28e40 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
28e50 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
28e60 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
28e70 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
28e80 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
28e90 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
28ea0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
28eb0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
28ec0 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
28ed0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
28ee0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
28ef0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
28f00 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
28f10 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
28f20 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
28f30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
28f40 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
28f50 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
28f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28f70 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
28f80 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28f90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
28fa0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
28fb0 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
28fc0 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
28fd0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
28fe0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
28ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
29000 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
29010 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
29020 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
29050 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
29060 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
29070 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
29080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
29090 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
290a0 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77  f all pWC->a[].w
290b0 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69  tFlags */.  sqli
290c0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
290d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
290e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
290f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
29100 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
29110 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
29120 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
29130 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
29140 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
29150 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
29160 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
29170 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
29180 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
29190 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
291a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
291b0 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
291c0 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
291d0 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
291e0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
291f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
29200 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
29210 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
29220 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
29230 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
29240 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
29250 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
29260 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
29270 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
29280 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
29290 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
292a0 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
292b0 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
292c0 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
292d0 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
292e0 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
292f0 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
29300 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
29310 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
29320 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29330 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
29340 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
29350 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
29360 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
29370 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
29380 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
29390 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
293a0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
293b0 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
293c0 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
293d0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
293e0 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
293f0 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
29400 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
29410 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
29420 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
29430 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
29440 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
29450 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
29460 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
29470 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
29480 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
29490 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
294a0 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
294b0 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
294c0 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
294d0 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
294e0 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
294f0 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
29500 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65 57  se->db;.  nByteW
29510 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
29520 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
29530 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
29540 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
29550 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
29560 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
29570 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74  (db, .      nByt
29580 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20  eWInfo + .      
29590 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75  sizeof(WhereClau
295a0 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65  se) +.      size
295b0 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29  of(WhereMaskSet)
295c0 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
295d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
295e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
295f0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
29600 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
29610 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
29620 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
29630 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
29640 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
29650 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
29660 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
29670 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
29680 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
29690 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
296a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
296b0 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20    pWInfo->pWC = 
296c0 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75  pWC = (WhereClau
296d0 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49  se *)&((u8 *)pWI
296e0 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d  nfo)[nByteWInfo]
296f0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
29700 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
29710 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73  ags;.  pWInfo->s
29720 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
29730 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
29740 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  oop;.  pMaskSet 
29750 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  = (WhereMaskSet*
29760 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20  )&pWC[1];..  /* 
29770 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
29780 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
29790 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
297a0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
297b0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
297c0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
297d0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
297e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
297f0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
29800 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
29810 69 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20  it(pWC, pParse, 
29820 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
29830 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
29840 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
29850 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
29860 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c  lit(pWC, pWhere,
29870 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49   TK_AND);   /* I
29880 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39  MP: R-15842-5329
29890 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  6 */.    .  /* S
298a0 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
298b0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
298c0 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
298d0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
298e0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
298f0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
29900 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
29910 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
29920 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
29930 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
29940 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
29950 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
29960 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
29970 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29980 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
29990 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
299a0 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
299b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
299c0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
299d0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
299e0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
299f0 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
29a00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29a10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
29a20 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
29a30 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
29a40 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
29a50 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
29a60 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
29a70 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
29a80 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
29a90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
29aa0 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
29ab0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
29ac0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
29ad0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
29ae0 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
29af0 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
29b00 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
29b10 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
29b20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
29b30 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
29b40 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
29b50 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
29b60 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
29b70 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
29b80 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
29b90 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
29ba0 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
29bb0 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
29bc0 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
29bd0 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
29be0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
29bf0 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
29c00 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
29c10 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
29c20 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
29c30 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
29c40 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
29c50 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
29c60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
29c70 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c  gure the WhereCl
29c80 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61  ause.vmask varia
29c90 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73  ble so that bits
29ca0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
29cb0 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c  .  ** to virtual
29cc0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61   table cursors a
29cd0 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20  re set. This is 
29ce0 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76  used to selectiv
29cf0 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a  ely disable .  *
29d00 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74  * the OR-to-IN t
29d10 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  ransformation in
29d20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
29d30 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20  rm(). It is not 
29d40 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69  helpful .  ** wi
29d50 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
29d60 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  s..  **.  ** Not
29d70 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
29d80 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
29d90 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
29da0 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
29db0 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
29dc0 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
29dd0 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
29de0 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
29df0 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
29e00 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
29e10 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
29e20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
29e30 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
29e40 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
29e50 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
29e60 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e  .  assert( pWC->
29e70 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73  vmask==0 && pMas
29e80 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  kSet->n==0 );.  
29e90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
29ea0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
29eb0 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
29ec0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
29ed0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
29ee0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
29ef0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
29f00 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
29f10 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
29f20 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72  ].pTab) && IsVir
29f30 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61  tual(pTabList->a
29f40 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [i].pTab) ){.   
29f50 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d     pWC->vmask |=
29f60 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20   ((Bitmask)1 << 
29f70 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  i);.    }.#endif
29f80 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
29f90 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
29fa0 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
29fb0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
29fc0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
29fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69  ; i++){.      Bi
29fe0 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
29ff0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2a000 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
2a010 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
2a020 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
2a030 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
2a040 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
2a050 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2a060 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
2a070 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
2a080 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
2a090 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
2a0a0 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
2a0b0 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
2a0c0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2a0d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2a0e0 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
2a0f0 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
2a100 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
2a110 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
2a120 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
2a130 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
2a140 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
2a150 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
2a160 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
2a170 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
2a180 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
2a190 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
2a1a0 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d   pWC);.  if( db-
2a1b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2a1c0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2a1d0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
2a1e0 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
2a1f0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
2a200 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
2a210 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a220 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
2a230 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
2a240 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2a250 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
2a260 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
2a270 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
2a280 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
2a290 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
2a2a0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
2a2b0 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73  nfo->a[].wsFlags
2a2c0 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
2a2d0 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
2a2e0 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
2a2f0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
2a300 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
2a310 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
2a320 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
2a330 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
2a340 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d  m     Which term
2a350 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2a360 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64  use is being cod
2a370 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ed.  **   pWInfo
2a380 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20  ->a[].iTabCur   
2a390 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
2a3a0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2a3b0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57   table.  **   pW
2a3c0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75  Info->a[].iIdxCu
2a3d0 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
2a3e0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
2a3f0 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
2a400 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57  >a[].pTerm     W
2a410 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f  hen wsFlags==WO_
2a420 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73  OR, the OR-claus
2a430 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a  e term.  **.  **
2a440 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
2a450 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
2a460 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
2a470 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2a480 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
2a490 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
2a4a0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2a4b0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
2a4c0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
2a4d0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
2a4e0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
2a4f0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
2a500 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
2a510 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
2a520 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
2a530 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
2a540 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b   i<nTabList; i++
2a550 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
2a560 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50   WhereCost bestP
2a570 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lan;         /* 
2a580 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70  Most efficient p
2a590 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20  lan seen so far 
2a5a0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
2a5b0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2a5c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
2a5d0 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
2a5e0 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
2a5f0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2a610 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52   looping over FR
2a620 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  OM tables */.   
2a630 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b   int bestJ = -1;
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a650 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
2a660 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
2a690 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
2a6a0 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f  J */.    int isO
2a6b0 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20  ptimal;         
2a6c0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2a6d0 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e   for optimal/non
2a6e0 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20  -optimal search 
2a6f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f  */.    int nUnco
2a700 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20  nstrained;      
2a710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62     /* Number tab
2a720 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45  les without INDE
2a730 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69  XED BY */.    Bi
2a740 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64  tmask notIndexed
2a750 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
2a760 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  k of tables that
2a770 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69   cannot use an i
2a780 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  ndex */..    mem
2a790 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30  set(&bestPlan, 0
2a7a0 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61  , sizeof(bestPla
2a7b0 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61  n));.    bestPla
2a7c0 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  n.rCost = SQLITE
2a7d0 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48  _BIG_DBL;.    WH
2a7e0 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42  ERETRACE(("*** B
2a7f0 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20  egin search for 
2a800 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20  loop %d ***\n", 
2a810 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  i));..    /* Loo
2a820 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65  p through the re
2a830 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20  maining entries 
2a840 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a850 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20  se to find the. 
2a860 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65     ** next neste
2a870 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70  d loop. The loop
2a880 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20   tests all FROM 
2a890 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20  clause entries. 
2a8a0 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63     ** either onc
2a8b0 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20  e or twice. .   
2a8c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
2a8d0 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77  irst test is alw
2a8e0 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ays performed if
2a8f0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
2a900 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20  r more entries. 
2a910 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20     ** remaining 
2a920 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72  and never perfor
2a930 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20  med if there is 
2a940 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c  only one FROM cl
2a950 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a  ause entry.    *
2a960 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d  * to choose from
2a970 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73  .  The first tes
2a980 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22  t looks for an "
2a990 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20  optimal" scan.  
2a9a0 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  In.    ** this c
2a9b0 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61  ontext an optima
2a9c0 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68  l scan is one th
2a9d0 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  at uses the same
2a9e0 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a   strategy.    **
2a9f0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46   for the given F
2aa00 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ROM clause entry
2aa10 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c   as would be sel
2aa20 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74  ected if the ent
2aa30 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75  ry.    ** were u
2aa40 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72  sed as the inner
2aa50 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  most nested loop
2aa60 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2aa70 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a  s, a table.    *
2aa80 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68  * is chosen such
2aa90 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f   that the cost o
2aaa0 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74  f running that t
2aab0 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  able cannot be r
2aac0 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  educed.    ** by
2aad0 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68   waiting for oth
2aae0 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e  er tables to run
2aaf0 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f   first.  This "o
2ab00 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72  ptimal" test wor
2ab10 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72  ks.    ** by fir
2ab20 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  st assuming that
2ab30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2ab40 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72   is on the inner
2ab50 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e   loop and findin
2ab60 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65  g.    ** its que
2ab70 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68  ry plan, then ch
2ab80 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66  ecking to see if
2ab90 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e   that query plan
2aba0 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a   uses any.    **
2abb0 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
2abc0 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  se terms that ar
2abd0 65 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66 20  e notReady.  If 
2abe0 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72 6d  no notReady term
2abf0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73 65  s are.    ** use
2ac00 64 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69  d then the "opti
2ac10 6d 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20  mal" query plan 
2ac20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  works..    **.  
2ac30 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2ac40 68 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f  he WhereCost.nRo
2ac50 77 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  w parameter for 
2ac60 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20  an optimal scan 
2ac70 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74  might.    ** not
2ac80 20 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20   be as small as 
2ac90 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74  it would be if t
2aca0 68 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20  he table really 
2acb0 77 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f  were the innermo
2acc0 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20  st.    ** join. 
2acd0 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
2ace0 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 20 62  can be reduced b
2acf0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  y WHERE clause c
2ad00 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
2ad10 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73  * that do not us
2ad20 65 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20  e indices.  But 
2ad30 74 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74  this nRow reduct
2ad40 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ion only happens
2ad50 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
2ad60 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
2ad70 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69  he innermost joi
2ad80 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  n.  .    **.    
2ad90 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ** The second lo
2ada0 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  op iteration is 
2adb0 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69  only performed i
2adc0 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61  f no optimal sca
2add0 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67  n.    ** strateg
2ade0 69 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62  ies were found b
2adf0 79 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  y the first iter
2ae00 61 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f  ation. This seco
2ae10 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20  nd iteration.   
2ae20 20 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73   ** is used to s
2ae30 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f  earch for the lo
2ae40 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f  west cost scan o
2ae50 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20  verall..    **. 
2ae60 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76     ** Previous v
2ae70 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2ae80 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79  e performed only
2ae90 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
2aea0 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74  ation -.    ** t
2aeb0 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73  he next outermos
2aec0 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79  t loop was alway
2aed0 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  s that with the 
2aee0 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20  lowest overall. 
2aef0 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65     ** cost. Howe
2af00 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20  ver, this meant 
2af10 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c  that SQLite coul
2af20 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f  d select the wro
2af30 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66  ng plan.    ** f
2af40 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20  or scripts such 
2af50 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
2af60 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20  :.    **   .    
2af70 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2af80 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20  E t1(a, b); .   
2af90 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
2afa0 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20  LE t2(c, d);.   
2afb0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
2afc0 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45  ROM t2, t1 WHERE
2afd0 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61   t2.rowid = t1.a
2afe0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
2aff0 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67  The best strateg
2b000 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20  y is to iterate 
2b010 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
2b020 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20   first. However 
2b030 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
2b040 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
2b050 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68  ermine this with
2b060 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
2b070 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
2b080 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 73  ** Since the cos
2b090 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63  t of a linear sc
2b0a0 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  an through table
2b0b0 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20   t2 is the same 
2b0c0 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63  .    ** as the c
2b0d0 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20  ost of a linear 
2b0e0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62  scan through tab
2b0f0 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20  le t1, a simple 
2b100 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61  greedy .    ** a
2b110 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f  lgorithm may cho
2b120 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f  ose to use t2 fo
2b130 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  r the outer loop
2b140 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63  , which is a muc
2b150 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65  h.    ** costlie
2b160 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20  r approach..    
2b170 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72  */.    nUnconstr
2b180 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e  ained = 0;.    n
2b190 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 20  otIndexed = 0;. 
2b1a0 20 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c     for(isOptimal
2b1b0 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74  =(iFrom<nTabList
2b1c0 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d  -1); isOptimal>=
2b1d0 30 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73  0 && bestJ<0; is
2b1e0 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20  Optimal--){.    
2b1f0 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 20    Bitmask mask; 
2b200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2b210 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e 6f  ask of tables no
2b220 74 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a 20  t yet ready */. 
2b230 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d       for(j=iFrom
2b240 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
2b250 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54  List->a[j]; j<nT
2b260 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54 61  abList; j++, pTa
2b270 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  bItem++){.      
2b280 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64    int doNotReord
2b290 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  er;    /* True i
2b2a0 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f  f this table sho
2b2b0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64  uld not be reord
2b2c0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
2b2d0 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b  WhereCost sCost;
2b2e0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66       /* Cost inf
2b2f0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65  ormation from be
2b300 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78  st[Virtual]Index
2b310 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  () */.        Ex
2b320 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2b330 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63  ;  /* ORDER BY c
2b340 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20  lause for index 
2b350 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20  to optimize */. 
2b360 20 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52   .        doNotR
2b370 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49  eorder =  (pTabI
2b380 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
2b390 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2b3a0 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  S))!=0;.        
2b3b0 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20  if( j!=iFrom && 
2b3c0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2b3d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20  reak;.        m 
2b3e0 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2b3f0 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
2b400 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
2b410 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64  if( (m & notRead
2b420 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
2b430 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20     if( j==iFrom 
2b440 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20  ) iFrom++;.     
2b450 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b470 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74 69 6d   mask = (isOptim
2b480 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65 61 64  al ? m : notRead
2b490 79 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  y);.        pOrd
2b4a0 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20 26 26  erBy = ((i==0 &&
2b4b0 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a 70 70   ppOrderBy )?*pp
2b4c0 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20 20 20 20  OrderBy:0);.    
2b4d0 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
2b4e0 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55  ->pIndex==0 ) nU
2b4f0 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a  nconstrained++;.
2b500 20 20 0a 20 20 20 20 20 20 20 20 57 48 45 52 45    .        WHERE
2b510 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79 69  TRACE(("=== tryi
2b520 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69 74 68  ng table %d with
2b530 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d   isOptimal=%d ==
2b540 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =\n",.          
2b550 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69 73 4f            j, isO
2b560 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20  ptimal));.      
2b570 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2b580 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e  em->pTab );.#ifn
2b590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b5a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2b5b0 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
2b5c0 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  al(pTabItem->pTa
2b5d0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
2b5e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2b5f0 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66  fo **pp = &pWInf
2b600 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
2b610 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
2b620 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
2b630 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
2b640 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61  em, mask, notRea
2b650 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20  dy, pOrderBy,.  
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 2c           &sCost,
2b680 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   pp);.        }e
2b690 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
2b6a0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2b6b0 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
2b6c0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
2b6d0 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52  Item, mask, notR
2b6e0 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a  eady, pOrderBy,.
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b700 20 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 29           &sCost)
2b710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b720 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2b730 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e  timal || (sCost.
2b740 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
2b750 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  0 );..        /*
2b760 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
2b770 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  Y clause is pres
2b780 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c  ent, then the pl
2b790 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74  an must use that
2b7a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2b7b0 78 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79  x if it uses any
2b7c0 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f   index at all */
2b7d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b7e0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2b7f0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x==0 .          
2b800 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73          || (sCos
2b810 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2b820 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2b830 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  CAN)==0.        
2b840 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f            || sCo
2b850 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  st.plan.u.pIdx==
2b860 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2b870 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
2b880 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73   isOptimal && (s
2b890 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2b8a0 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2b8b0 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
2b8c0 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78          notIndex
2b8d0 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ed |= m;.       
2b8e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
2b8f0 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20  onditions under 
2b900 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65  which this table
2b910 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73   becomes the bes
2b920 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20  t so far:.      
2b930 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2b940 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20    (1) The table 
2b950 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20  must not depend 
2b960 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  on other tables 
2b970 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20  that have not.  
2b980 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79        **       y
2b990 65 74 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20  et run..        
2b9a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2b9b0 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65  (2) A full-table
2b9c0 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f  -scan plan canno
2b9d0 74 20 73 75 70 65 72 63 65 64 65 20 61 6e 6f 74  t supercede anot
2b9e0 68 65 72 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a  her plan unless.
2b9f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2ba00 20 69 74 20 69 73 20 61 6e 20 22 6f 70 74 69 6d   it is an "optim
2ba10 61 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69  al" plan as defi
2ba20 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
2ba30 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2ba40 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65     (3) All table
2ba50 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45  s have an INDEXE
2ba60 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74  D BY clause or t
2ba70 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20  his table lacks 
2ba80 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  an.        **   
2ba90 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63      INDEXED BY c
2baa0 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61  lause or this ta
2bab0 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65  ble uses the spe
2bac0 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a  cific.        **
2bad0 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65         index spe
2bae0 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e  cified by its IN
2baf0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
2bb00 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75    This rule ensu
2bb10 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  res.        **  
2bb20 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74       that a best
2bb30 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79  -so-far is alway
2bb40 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20  s selected even 
2bb50 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65  if an impossible
2bb60 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2bb70 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66    combination of
2bb80 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2bb90 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20  ses are given.  
2bba0 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  The error.      
2bbb0 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20    **       will 
2bbc0 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
2bbd0 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20  relayed back to 
2bbe0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
2bbf0 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  later..        *
2bc00 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45  *       The NEVE
2bc10 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  R() comes about 
2bc20 62 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29  because rule (2)
2bc30 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a   above prevents.
2bc40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2bc50 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75   An indexable fu
2bc60 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72  ll-table-scan fr
2bc70 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65  om reaching rule
2bc80 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a   (3)..        **
2bc90 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34  .        **   (4
2bca0 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20  ) The plan cost 
2bcb0 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68  must be lower th
2bcc0 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f  an prior plans o
2bcd0 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20  r else the.     
2bce0 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74     **       cost
2bcf0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
2bd00 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
2bd10 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65   of rows must be
2bd20 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20   lower..        
2bd30 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
2bd40 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65  sCost.used&notRe
2bd50 61 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20  ady)==0         
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd70 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
2bd80 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20      && (bestJ<0 
2bd90 7c 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d  || (notIndexed&m
2bda0 29 21 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )!=0            
2bdb0 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2bdd0 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2bde0 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2bdf0 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20  FULLSCAN)!=0).  
2be00 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 55            && (nU
2be10 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20  nconstrained==0 
2be20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  || pTabItem->pIn
2be30 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20  dex==0   /* (3) 
2be40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2be50 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f     || NEVER((sCo
2be60 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2be70 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2be80 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20  SCAN)!=0)).     
2be90 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a         && (bestJ
2bea0 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73  <0 || sCost.rCos
2beb0 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  t<bestPlan.rCost
2bec0 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
2bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bee0 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c  || (sCost.rCost<
2bef0 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20  =bestPlan.rCost 
2bf00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf10 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61 6e 2e    && sCost.plan.
2bf20 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c  nRow<bestPlan.pl
2bf30 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20  an.nRow)).      
2bf40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57    ){.          W
2bf50 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20  HERETRACE(("=== 
2bf60 74 61 62 6c 65 20 25 64 20 69 73 20 62 65 73 74  table %d is best
2bf70 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20 20 20   so far".       
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2bf90 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e   with cost=%g an
2bfa0 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20  d nRow=%g\n",.  
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfc0 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72 43 6f      j, sCost.rCo
2bfd0 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e  st, sCost.plan.n
2bfe0 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Row));.         
2bff0 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73   bestPlan = sCos
2c000 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  t;.          bes
2c010 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
2c020 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 6f  }.        if( do
2c030 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
2c040 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2c050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65  }.    assert( be
2c060 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  stJ>=0 );.    as
2c070 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26  sert( notReady &
2c080 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2c090 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
2c0a0 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
2c0b0 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
2c0c0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2c0d0 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25   selects table %
2c0e0 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22 0a 20  d for loop %d". 
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c100 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e   with cost=%g an
2c110 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20  d nRow=%g\n",.  
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
2c130 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57 49 6e  stJ, pLevel-pWIn
2c140 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e  fo->a, bestPlan.
2c150 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e  rCost, bestPlan.
2c160 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20  plan.nRow));.   
2c170 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
2c180 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2c190 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20  ERE_ORDERBY)!=0 
2c1a0 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65  ){.      *ppOrde
2c1b0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
2c1c0 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62     andFlags &= b
2c1d0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
2c1e0 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
2c1f0 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61  ->plan = bestPla
2c200 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74  n.plan;.    test
2c210 63 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70  case( bestPlan.p
2c220 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2c230 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20  ERE_INDEXED );. 
2c240 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
2c250 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2c260 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
2c270 49 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28  INDEX );.    if(
2c280 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77   bestPlan.plan.w
2c290 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
2c2a0 49 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45  INDEXED|WHERE_TE
2c2b0 4d 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  MP_INDEX) ){.   
2c2c0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43     pLevel->iIdxC
2c2d0 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2c2e0 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  b++;.    }else{.
2c2f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
2c300 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20  dxCur = -1;.    
2c310 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  }.    notReady &
2c320 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  = ~getMask(pMask
2c330 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2c340 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2c350 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
2c360 72 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b  rom = (u8)bestJ;
2c370 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
2c380 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f  n.plan.nRow>=(do
2c390 75 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20  uble)1 ){.      
2c3a0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
2c3b0 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70  op *= bestPlan.p
2c3c0 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a  lan.nRow;.    }.
2c3d0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
2c3e0 61 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  at if the table 
2c3f0 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20  scanned by this 
2c400 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68  loop iteration h
2c410 61 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44  ad an.    ** IND
2c420 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61  EXED BY clause a
2c430 74 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74  ttached to it, t
2c440 68 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  hat the named in
2c450 64 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20  dex is being.   
2c460 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65   ** used for the
2c470 20 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74   scan. If not, t
2c480 68 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c  hen query compil
2c490 61 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64  ation has failed
2c4a0 2e 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  ..    ** Return 
2c4b0 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  an error..    */
2c4c0 0a 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62  .    pIdx = pTab
2c4d0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70  List->a[bestJ].p
2c4e0 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
2c4f0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Idx ){.      if(
2c500 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
2c510 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c520 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20  INDEXED)==0 ){. 
2c530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2c540 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2c550 63 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78  cannot use index
2c560 3a 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  : %s", pIdx->zNa
2c570 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
2c580 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c590 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
2c5a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
2c5b0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2c5c0 73 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  se is used, the 
2c5d0 62 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63  bestIndex() func
2c5e0 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20  tion is.        
2c5f0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
2c600 20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20   find the index 
2c610 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2c620 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2c630 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  se.        ** if
2c640 20 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65   it find an inde
2c650 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20  x at all. */.   
2c660 20 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73       assert( bes
2c670 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64  tPlan.plan.u.pId
2c680 78 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20  x==pIdx );.     
2c690 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57   }.    }.  }.  W
2c6a0 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2c6b0 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2c6c0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  ed ***\n"));.  i
2c6d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2c6e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2c6f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2c700 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2c710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c720 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e  e total query on
2c730 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e  ly selects a sin
2c740 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68  gle row, then th
2c750 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
2c760 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65  clause is irrele
2c770 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  vant..  */.  if(
2c780 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
2c790 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26  RE_UNIQUE)!=0 &&
2c7a0 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20   ppOrderBy ){.  
2c7b0 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
2c7c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c7d0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
2c7e0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2c7f0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2c800 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
2c810 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
2c820 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
2c830 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
2c840 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
2c850 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
2c860 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
2c870 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
2c880 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
2c890 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
2c8a0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
2c8b0 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
2c8c0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
2c8d0 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
2c8e0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2c8f0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
2c900 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
2c910 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
2c920 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2c930 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
2c940 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20   && (andFlags & 
2c950 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
2c960 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   ){.    pWInfo->
2c970 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20  okOnePass = 1;. 
2c980 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
2c990 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20  plan.wsFlags &= 
2c9a0 7e 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b  ~WHERE_IDX_ONLY;
2c9b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2c9c0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
2c9d0 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
2c9e0 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
2c9f0 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
2ca00 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
2ca10 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
2ca20 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
2ca30 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
2ca40 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
2ca50 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
2ca60 6f 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  oto */.  notRead
2ca70 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2ca80 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
2ca90 75 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  ut = (double)1;.
2caa0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2cab0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e  l=pWInfo->a; i<n
2cac0 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c  TabList; i++, pL
2cad0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
2cae0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
2caf0 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
2cb00 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
2cb10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2cb20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
2cb30 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
2cb40 65 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49  ex */..    pTabI
2cb50 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2cb60 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2cb70 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
2cb80 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
2cb90 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
2cba0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2cbb0 75 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66  ursor;.    pWInf
2cbc0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c  o->nRowOut *= pL
2cbd0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b  evel->plan.nRow;
2cbe0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
2cbf0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2cc00 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2cc10 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
2cc20 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2cc30 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
2cc40 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2cc50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
2cc60 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65  othing */.    }e
2cc70 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
2cc80 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2cc90 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
2cca0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2ccb0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2ccc0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
2ccd0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2cce0 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
2ccf0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
2cd00 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
2cd10 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
2cd20 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2cd30 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
2cd40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2cd50 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
2cd60 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
2cd70 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
2cd80 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
2cd90 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2cda0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2cdb0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
2cdc0 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2cdd0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
2cde0 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20  T_OPEN)==0 ){.  
2cdf0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49      int op = pWI
2ce00 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f  nfo->okOnePass ?
2ce10 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20   OP_OpenWrite : 
2ce20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2ce30 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
2ce40 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
2ce50 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
2ce60 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
2ce70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ce80 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
2ce90 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2cea0 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
2ceb0 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  BMS );.      if(
2cec0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
2ced0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
2cee0 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
2cef0 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
2cf00 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
2cf10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
2cf20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
2cf30 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
2cf40 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
2cf50 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2cf60 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2cf70 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a  rentAddr(v)-1, .
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2cfa0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29  TE_INT_TO_PTR(n)
2cfb0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
2cfc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
2cfd0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
2cfe0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2cff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2d000 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2d010 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2d020 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2d030 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2d040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2d050 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
2d060 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2d070 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2d080 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30  E_TEMP_INDEX)!=0
2d090 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2d0a0 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2d0b0 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
2d0c0 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
2d0d0 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  y, pLevel);.    
2d0e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
2d0f0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2d100 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2d110 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
2d120 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2d130 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Ix = pLevel->pla
2d140 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20  n.u.pIdx;.      
2d150 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
2d160 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
2d170 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
2d180 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  ;.      int iIdx
2d190 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
2d1a0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73  dxCur;.      ass
2d1b0 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
2d1c0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
2d1d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2d1e0 28 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ( iIdxCur>=0 );.
2d1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d200 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2d210 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
2d220 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
2d230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d240 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2d250 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
2d260 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
2d270 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d280 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
2d290 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
2d2a0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2d2b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
2d2c0 44 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  Db);.    notRead
2d2d0 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57  y &= ~getMask(pW
2d2e0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  C->pMaskSet, pTa
2d2f0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2d300 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  .  }.  pWInfo->i
2d310 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2d320 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2d330 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2d340 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
2d350 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2d360 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
2d370 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
2d380 65 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20  e search.  Each 
2d390 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2d3a0 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62   for.  ** loop b
2d3b0 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63  elow generates c
2d3c0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
2d3d0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20   nested loop of 
2d3e0 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67  the VM.  ** prog
2d3f0 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  ram..  */.  notR
2d400 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
2d410 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  )0;.  for(i=0; i
2d420 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b  <nTabList; i++){
2d430 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2d440 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
2d450 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
2d460 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2d470 2c 20 70 4c 65 76 65 6c 2c 20 69 2c 20 70 4c 65  , pLevel, i, pLe
2d480 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72  vel->iFrom, wctr
2d490 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74  lFlags);.    not
2d4a0 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c  Ready = codeOneL
2d4b0 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
2d4c0 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20   i, wctrlFlags, 
2d4d0 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
2d4e0 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
2d4f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43   = pLevel->addrC
2d500 6f 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ont;.  }..#ifdef
2d510 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a   SQLITE_TEST  /*
2d520 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   For testing and
2d530 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
2d540 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f  nly */.  /* Reco
2d550 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  rd in the query 
2d560 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  plan information
2d570 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65   about the curre
2d580 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e  nt table.  ** an
2d590 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  d the index used
2d5a0 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69   to access it (i
2d5b0 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20  f any).  If the 
2d5c0 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a  table itself.  *
2d5d0 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69  * is not used, i
2d5e0 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  ts name is just 
2d5f0 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64  '{}'.  If no ind
2d600 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  ex is used.  ** 
2d610 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73  the index is lis
2d620 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66  ted as "{}".  If
2d630 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
2d640 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a   is used the.  *
2d650 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20  * index name is 
2d660 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  '*'..  */.  for(
2d670 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b  i=0; i<nTabList;
2d680 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
2d690 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  *z;.    int n;. 
2d6a0 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2d6b0 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70  nfo->a[i];.    p
2d6c0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2d6d0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2d6e0 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70  From];.    z = p
2d6f0 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  TabItem->zAlias;
2d700 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
2d710 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  z = pTabItem->pT
2d720 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  ab->zName;.    n
2d730 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d740 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
2d750 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
2d760 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
2d770 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
2d780 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
2d790 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2d7a0 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20  E_IDX_ONLY ){.  
2d7b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
2d7c0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
2d7d0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20  [nQPlan], "{}", 
2d7e0 32 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  2);.        nQPl
2d7f0 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  an += 2;.      }
2d800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
2d810 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
2d820 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
2d830 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
2d840 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
2d850 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2d860 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
2d870 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
2d880 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
2d890 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
2d8a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2d8b0 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20  _ROWID_EQ );.   
2d8c0 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
2d8d0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2d8e0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
2d8f0 4e 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70  NGE );.    if( p
2d900 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
2d910 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
2d920 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
2d930 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
2d940 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
2d950 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2d960 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a  lan], "* ", 2);.
2d970 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
2d980 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2d990 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2d9a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2d9b0 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20  NDEXED)!=0 ){.  
2d9c0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
2d9d0 74 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e  trlen30(pLevel->
2d9e0 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61  plan.u.pIdx->zNa
2d9f0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
2da00 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
2da10 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
2da20 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
2da30 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
2da40 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2da50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  lan], pLevel->pl
2da60 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
2da70 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
2da80 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
2da90 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
2daa0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
2dab0 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = ' ';.      }. 
2dac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dad0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
2dae0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2daf0 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
2db00 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
2db10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
2db20 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
2db30 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2db40 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
2db50 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
2db60 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
2db70 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
2db80 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
2db90 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
2dba0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
2dbb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2dbc0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
2dbd0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
2dbe0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
2dbf0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
2dc00 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
2dc10 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
2dc20 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
2dc30 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
2dc40 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
2dc50 2f 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  /.  return pWInf
2dc60 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  o;..  /* Jump he
2dc70 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  re if malloc fai
2dc80 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e  ls */.whereBegin
2dc90 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49  Error:.  if( pWI
2dca0 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73  nfo ){.    pPars
2dcb0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
2dcc0 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
2dcd0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  eryLoop;.    whe
2dce0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2dcf0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  WInfo);.  }.  re
2dd00 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2dd10 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
2dd20 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
2dd30 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
2dd40 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
2dd50 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
2dd60 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2dd70 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
2dd80 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
2dd90 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
2dda0 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  nfo){.  Parse *p
2ddb0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2ddc0 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
2ddd0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2dde0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  e;.  int i;.  Wh
2ddf0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
2de00 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2de10 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e  bList = pWInfo->
2de20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69  pTabList;.  sqli
2de30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2de40 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  ->db;..  /* Gene
2de50 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
2de60 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
2de70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2de80 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2de90 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f  ;.  for(i=pWInfo
2dea0 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30  ->nLevel-1; i>=0
2deb0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
2dec0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2ded0 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
2dee0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2def0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43  v, pLevel->addrC
2df00 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ont);.    if( pL
2df10 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f  evel->op!=OP_Noo
2df20 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
2df30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2df40 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
2df50 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2df60 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  p2);.      sqlit
2df70 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2df80 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20  , pLevel->p5);. 
2df90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
2dfa0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2dfb0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
2dfc0 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  E && pLevel->u.i
2dfd0 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20  n.nIn>0 ){.     
2dfe0 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
2dff0 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
2e000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e010 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2e020 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e  v, pLevel->addrN
2e030 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
2e040 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  =pLevel->u.in.nI
2e050 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e  n, pIn=&pLevel->
2e060 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  u.in.aInLoop[j-1
2e070 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
2e080 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
2e090 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2e0a0 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
2e0b0 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  op+1);.        s
2e0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e0d0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e  (v, OP_Next, pIn
2e0e0 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64  ->iCur, pIn->add
2e0f0 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
2e100 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2e110 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
2e120 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
2e130 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2e140 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
2e150 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
2e160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e170 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2e180 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
2e190 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
2e1a0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2e1b0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
2e1c0 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
2e1d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2e1e0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
2e1f0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
2e200 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oin);.      asse
2e210 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
2e220 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e230 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
2e240 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
2e250 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2e260 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2e270 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)!=0 );.      
2e280 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2e290 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e2a0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e2c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e2d0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
2e2e0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2e2f0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2e300 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
2e310 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
2e320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e330 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2e340 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
2e350 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2e360 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2e370 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
2e380 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e390 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e3a0 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
2e3b0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
2e3c0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2e3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2e3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e3f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
2e400 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
2e410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e420 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2e430 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
2e440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
2e450 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
2e460 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
2e470 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2e480 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
2e490 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
2e4a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
2e4b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
2e4c0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
2e4d0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
2e4e0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
2e4f0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
2e500 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2e510 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  gin..  */.  asse
2e520 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
2e530 65 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d  el==1 || pWInfo-
2e540 3e 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73  >nLevel==pTabLis
2e550 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72  t->nSrc );.  for
2e560 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
2e570 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f  nfo->a; i<pWInfo
2e580 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70  ->nLevel; i++, p
2e590 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74  Level++){.    st
2e5a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2e5b0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
2e5c0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2e5d0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
2e5e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
2e5f0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2e600 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2e610 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
2e620 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2e630 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20  _Ephemeral)==0. 
2e640 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65      && pTab->pSe
2e650 6c 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20  lect==0.     && 
2e660 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2e670 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
2e680 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29  _CLOSE)==0.    )
2e690 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d  {.      int ws =
2e6a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
2e6b0 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
2e6c0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
2e6d0 61 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45  ass && (ws & WHE
2e6e0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2e6f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e700 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2e710 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
2e720 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2e730 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e740 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2e750 58 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26  XED)!=0 && (ws &
2e760 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
2e770 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  X)==0 ){.       
2e780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e790 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2e7a0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
2e7b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e7c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2e7d0 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
2e7e0 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
2e7f0 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
2e800 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
2e810 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
2e820 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
2e830 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
2e840 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
2e850 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
2e860 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
2e870 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
2e880 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
2e890 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
2e8a0 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
2e8b0 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
2e8c0 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
2e8d0 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
2e8e0 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
2e8f0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
2e900 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
2e910 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2e920 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
2e930 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
2e940 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
2e950 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
2e960 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2e970 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
2e980 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
2e990 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
2e9a0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
2e9b0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
2e9c0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2e9d0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
2e9e0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
2e9f0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
2ea00 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
2ea10 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
2ea20 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
2ea30 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
2ea40 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
2ea50 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
2ea60 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
2ea70 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
2ea80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2ea90 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2eaa0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2eab0 45 58 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d  EXED)!=0 && !db-
2eac0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a  >mallocFailed){.
2ead0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
2eae0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
2eaf0 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49  Op *pOp;.      I
2eb00 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65  ndex *pIdx = pLe
2eb10 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
2eb20 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
2eb30 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
2eb40 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
2eb50 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
2eb60 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
2eb70 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
2eb80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2eb90 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
2eba0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
2ebb0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
2ebc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
2ebd0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
2ebe0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
2ebf0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
2ec00 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
2ec10 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2ec20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
2ec30 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
2ec40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2ec50 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
2ec60 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
2ec70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ec80 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
2ec90 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2eca0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2ecb0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
2ecc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ecd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ece0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
2ecf0 73 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70  sert( (pLevel->p
2ed00 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2ed10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed30 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  || j<pIdx->nColu
2ed40 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  mn );.        }e
2ed50 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
2ed60 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b  ode==OP_Rowid ){
2ed70 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
2ed80 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2ed90 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2eda0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
2edb0 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20  _IdxRowid;.     
2edc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2edd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
2ede0 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
2edf0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2ee00 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2ee10 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2ee20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
2ee30 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72  db, pWInfo);.  r
2ee40 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.