/ Hex Artifact Content
Login

Artifact 6dedaffcf818448ed8de4f0992fad2e181852638:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0350: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0370: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0380: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
03a0: 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
03b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
03c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
03e0: 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57 48  BUG).# define WH
03f0: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0410: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0420: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0430: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0440: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
0450: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
0460: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
0470: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
0480: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0490: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04a0: 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61  eMaskSet WhereMa
04b0: 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73  skSet;.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
04d0: 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74  o WhereOrInfo;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65  ereAndInfo Where
0500: 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  AndInfo;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73   struct WhereCos
0520: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
0530: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0540: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0550: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0560: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0570: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0580: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0590: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
05a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05b0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05c0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05e0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05f0: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
0600: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
0610: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
0620: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
0630: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
0640: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
0650: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
0660: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
0670: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0680: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
0690: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
06a0: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
06b0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
06c0: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
06d0: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
06e0: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
06f0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
0700: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
0710: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
0720: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
0730: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
0740: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
0750: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
0760: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
0770: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
0780: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
0790: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
07a0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07b0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07d0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07e0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
07f0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
0800: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
0810: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
0820: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
0830: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
0840: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
0850: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
0860: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
0870: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
0880: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
0890: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
08a0: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
08b0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
08c0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
08d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
08e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
08f0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
0900: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
0910: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
0920: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
0930: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
0940: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
0950: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
0960: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
0970: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
0980: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
0990: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
09a0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
09b0: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
09c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
09d0: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
09e0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
09f0: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
0a00: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
0a10: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
0a20: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
0a30: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
0a40: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
0a50: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
0a60: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
0a70: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
0a80: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
0a90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
0ab0: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
0ac0: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
0ad0: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
0ae0: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
0af0: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
0b00: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
0b10: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
0b20: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
0b30: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
0b40: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0b50: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0b60: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0b70: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0b80: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0b90: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
0ba0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0bb0: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0bc0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0bd0: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0be0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0bf0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0c00: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0c10: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0c20: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0c30: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0c40: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0c50: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0c60: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0c70: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0c80: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0c90: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0ca0: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0cb0: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0cc0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0cd0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ce0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0cf0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0d00: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
0d10: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
0d20: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
0d30: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
0d40: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
0d50: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
0d60: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
0d70: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
0d80: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
0d90: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
0da0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
0db0: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
0dc0: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
0dd0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
0de0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0df0: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
0e00: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
0e10: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
0e20: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0e30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
0e40: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e60: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
0e70: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
0e80: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
0e90: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
0ea0: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
0eb0: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
0ec0: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
0ed0: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
0ee0: 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
0ef0: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f00: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0f10: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0f20: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0f40: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0f50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
0f60: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
0f70: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
0f90: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
0fa0: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
0fb0: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
0fc0: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0fe0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
0ff0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
1000: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
1010: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
1020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
1030: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
1040: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
1050: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
1060: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
1070: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
1080: 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61  mation if eOpera
1090: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20  tor==WO_OR */.  
10a0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
10b0: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
10c0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
10d0: 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  f eOperator==WO_
10e0: 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  AND */.  } u;.  
10f0: 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  u16 eOperator;  
1100: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f          /* A WO_
1110: 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  xx value describ
1120: 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38  ing <op> */.  u8
1130: 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20   wtFlags;       
1140: 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78        /* TERM_xx
1150: 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65  x bit flags.  Se
1160: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20  e below */.  u8 
1170: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
1180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1190: 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20  f children that 
11a0: 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20  must disable us 
11b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11c0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20   *pWC;       /* 
11d0: 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20  The clause this 
11e0: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
11f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
1200: 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20  reqRight;    /* 
1210: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
1220: 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d  s used by pExpr-
1230: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
1240: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
1250: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
1260: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
1270: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
1280: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1290: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65  ed values of Whe
12a0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a  reTerm.wtFlags.*
12b0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
12c0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
12d0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
12e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f  te(db, pExpr) */
1300: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
1310: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
1320: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
1330: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
1340: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
1350: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
1360: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
1370: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
1380: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
1390: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
13a0: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
13b0: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
13c0: 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  ine TERM_ORINFO 
13d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65      0x10   /* Ne
13e0: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
13f0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
1400: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65  fo object */.#de
1410: 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46  fine TERM_ANDINF
1420: 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e  O    0x20   /* N
1430: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64  WhereTerm.u.pAnd
1450: 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66  Info obj */.#def
1460: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
1470: 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73      0x40   /* Us
1480: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
1490: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
14a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
14b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
14c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
14d0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
14e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
14f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1500: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1510: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1520: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1530: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1540: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1570: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1580: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
1590: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15a0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
15b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
15c0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
15d0: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15f0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1600: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1610: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1620: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1630: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1640: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
1650: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
1660: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1680: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1690: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16c0: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
16d0: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
16e0: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
16f0: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1700: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1710: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1720: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1730: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1740: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
1750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1760: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1770: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1780: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1790: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17a0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
17b0: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
17c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
17d0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17e0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17f0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1800: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1810: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1820: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1830: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1840: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1850: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1860: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1870: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1880: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1890: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
18b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
18c0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
18d0: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18e0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1900: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1910: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1920: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1930: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1940: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1950: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1960: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1970: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1980: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1990: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19a0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
19c0: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
19d0: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a10: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a20: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a40: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a50: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a60: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a80: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a90: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1aa0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1ab0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1ac0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1ad0: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1ae0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1af0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b00: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b10: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b20: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b30: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b40: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b50: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b60: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b70: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b80: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b90: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1ba0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1bb0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1bc0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1bd0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1be0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bf0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c00: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c10: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c20: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c50: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c60: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c70: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c80: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c90: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1ca0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1cb0: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1cc0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1cd0: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ce0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cf0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d00: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d20: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d30: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d40: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d50: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d80: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d90: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1da0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1db0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1dc0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1dd0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1de0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1df0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e00: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e20: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e30: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e40: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e60: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e70: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e80: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e90: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ea0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1eb0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1ec0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1ed0: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ee0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f10: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f20: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f30: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f50: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f60: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f70: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f80: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f90: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1fa0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1fb0: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1fc0: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1fd0: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fe0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1ff0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2000: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2010: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2020: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2030: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2040: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2050: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2060: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  y */.  double nR
2070: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2080: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2090: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
20a0: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20    Bitmask used; 
20b0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
20c0: 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  of cursors used 
20d0: 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a  by this plan */.
20e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
20f0: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
2100: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
2110: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
2120: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
2130: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
2140: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
2150: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
2160: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
2170: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
2180: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
2190: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
21a0: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
21b0: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
21c0: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
21d0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
21e0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21f0: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2200: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2210: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
2220: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2230: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
2240: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
2250: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
2260: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
2270: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
2280: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
2290: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
22a0: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
22b0: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
22c0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
22d0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
22e0: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
22f0: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2300: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2310: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
2320: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
2330: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
2340: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
2350: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
2360: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47  .#define WO_SING
2370: 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f  LE 0x0ff       /
2380: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f  * Mask of all no
2390: 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20  n-compound WO_* 
23a0: 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  values */../*.**
23b0: 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61   Value for wsFla
23c0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
23d0: 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73  estIndex() and s
23e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72  tored in.** Wher
23f0: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20  eLevel.wsFlags. 
2400: 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74   These flags det
2410: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61  ermine which sea
2420: 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65  rch.** strategie
2430: 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
2440: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61  e..**.** The lea
2450: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
2460: 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76  2 bits is reserv
2470: 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72  ed as a mask for
2480: 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76   WO_ values abov
2490: 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c  e..** The WhereL
24a0: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
24b0: 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65  ld is usually se
24c0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
24d0: 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42  |WO_ISNULL..** B
24e0: 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ut if the table 
24f0: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
2500: 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  le of a left joi
2510: 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  n, WhereLevel.ws
2520: 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  Flags.** is set 
2530: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
2540: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2550: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61  wsFlags field ca
2560: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
2570: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
2580: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
2590: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
25a0: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
25b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
25c0: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
25d0: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
25e0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
25f0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2600: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
2610: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
2620: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
2630: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
2640: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30  ID_EQ     0x0000
2650: 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45  1000  /* rowid=E
2660: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
2670: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
2680: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2690: 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20  GE  0x00002000  
26a0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
26b0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
26d0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
26e0: 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45  00010000  /* x=E
26f0: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
2700: 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a  ) or x IS NULL *
2710: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2720: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
2730: 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0020000  /* x<EX
2740: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
2750: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2760: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
2770: 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20  x00040000  /* x 
2780: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
2790: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
27a0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30  _NULL  0x0008000
27b0: 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  0  /* x IS NULL 
27c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
27d0: 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78  _INDEXED      0x
27e0: 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79  000f0000  /* Any
27f0: 74 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20  thing that uses 
2800: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66  an index */.#def
2810: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2820: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2830: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2840: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2850: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2860: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2870: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2880: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
2890: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
28a0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
28b0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
28c0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
28d0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
28e0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
28f0: 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  ine WHERE_IDX_ON
2900: 4c 59 20 20 20 20 20 30 78 30 30 38 30 30 30 30  LY     0x0080000
2910: 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20  0  /* Use index 
2920: 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c  only - omit tabl
2930: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  e */.#define WHE
2940: 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20  RE_ORDERBY      
2950: 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f  0x01000000  /* O
2960: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
2970: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
2980: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
2990: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
29a0: 20 30 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20   0x02000000  /* 
29b0: 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  Scan in reverse 
29c0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
29d0: 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20   WHERE_UNIQUE   
29e0: 20 20 20 20 30 78 30 34 30 30 30 30 30 30 20 20      0x04000000  
29f0: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
2a00: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
2a10: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2a20: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
2a30: 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65  08000000  /* Use
2a40: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70   virtual-table p
2a50: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65  rocessing */.#de
2a60: 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49  fine WHERE_MULTI
2a70: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30 30  _OR     0x100000
2a80: 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20  00  /* OR using 
2a90: 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73  multiple indices
2aa0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
2ab0: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
2ac0: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
2ad0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2ae0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2af0: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
2b00: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2b10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
2b20: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
2b30: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2b40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b60: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2b70: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2b80: 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f  et *pMaskSet   /
2b90: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
2ba0: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
2bb0: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
2bc0: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
2bd0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2be0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
2bf0: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
2c00: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
2c10: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
2c20: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
2c30: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
2c40: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
2c50: 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d  WC->vmask = 0;.}
2c60: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2c70: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2c80: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2c90: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2ca0: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2cb0: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2cc0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2cd0: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2ce0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2cf0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2d00: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2d10: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2d20: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2d30: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2d40: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2d50: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2d60: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2d70: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2d80: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2d90: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2db0: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2dc0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2dd0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2de0: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2df0: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2e00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2e10: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2e20: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2e30: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2e40: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2e50: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2e60: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2e70: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2e80: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2e90: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2ea0: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2ec0: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2ed0: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2ee0: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2ef0: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2f00: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2f10: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2f20: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2f30: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2f40: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2f50: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2f60: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
2f70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2f80: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
2f90: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
2fa0: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
2fb0: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
2fc0: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
2fd0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
2fe0: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
2ff0: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
3000: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
3010: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
3020: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
3030: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
3040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
3050: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
3060: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
3070: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3080: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
3090: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
30a0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
30b0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
30c0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
30d0: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
30e0: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
30f0: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3100: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
3110: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
3120: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
3130: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
3140: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
3150: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
3160: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
3170: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
3180: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
3190: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
31a0: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
31b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
31c0: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
31d0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
31e0: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
31f0: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3200: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
3210: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
3220: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
3230: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
3240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3250: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
3260: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3270: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
3280: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
3290: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
32a0: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
32b0: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
32c0: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
32d0: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
32e0: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
32f0: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3300: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
3310: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
3320: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
3330: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
3340: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
3350: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
3360: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
3370: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
3380: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
3390: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
33a0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
33b0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
33c0: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
33d0: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
33e0: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
33f0: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3400: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
3410: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
3420: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
3430: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
3440: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
3450: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
3460: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
3470: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
3480: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3490: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
34a0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
34b0: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
34c0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
34d0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
34e0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
34f0: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3510: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3520: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3530: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3540: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3550: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3560: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3570: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
3580: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
3590: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
35a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
35b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
35c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
35e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
35f0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3600: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3610: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3620: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3630: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3640: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3660: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3670: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
3680: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3690: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
36a0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
36b0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
36c0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
36d0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
36e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
36f0: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3700: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3710: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3720: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3730: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3740: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3760: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3770: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
3780: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
3790: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
37a0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
37b0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
37c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
37d0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
37e0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
37f0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3800: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3810: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3820: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3830: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3840: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3850: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3860: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3870: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3880: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3890: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
38a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
38b0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
38c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
38d0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
38e0: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
38f0: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3900: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3920: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3930: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3940: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3950: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3960: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3970: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3980: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3990: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
39a0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
39b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
39c0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
39d0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
39e0: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
39f0: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3a00: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3a10: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3a20: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3a30: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3a40: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3a50: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3a60: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3a70: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3a80: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3a90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3aa0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3ab0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ac0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3ad0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3ae0: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3af0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3b00: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3b20: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3b30: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3b40: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3b50: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3b60: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3b70: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3b80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3b90: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3ba0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3bb0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3bc0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3bd0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3be0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3bf0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3c00: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3c10: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3c20: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3c30: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3c40: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3c50: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3c60: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3c70: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3c80: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3c90: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ca0: 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ->n<=sizeof(Bitm
3cb0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
3cc0: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
3cd0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
3ce0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
3cf0: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
3d00: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
3d10: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
3d20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
3d40: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
3d50: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
3d60: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
3d70: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
3d80: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
3d90: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
3da0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
3db0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3dc0: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
3dd0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
3de0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
3df0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
3e00: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
3e10: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
3e20: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
3e30: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
3e40: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
3e50: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
3e60: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
3e70: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
3e80: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
3e90: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
3ea0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
3eb0: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
3ec0: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
3ed0: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
3ee0: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
3ef0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
3f00: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
3f10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3f20: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
3f30: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
3f40: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
3f50: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
3f60: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
3f70: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
3f80: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
3f90: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
3fa0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
3fb0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
3fc0: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
3fd0: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
3fe0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
3ff0: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4000: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4010: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4020: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4030: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4040: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
4050: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
4060: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
4070: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
4080: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
4090: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
40a0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
40b0: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
40c0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
40d0: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
40e0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
40f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4100: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4110: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4120: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4130: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4140: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
4150: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
4160: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
4170: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
4180: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4190: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
41a0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
41b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
41c0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
41d0: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
41e0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
41f0: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4200: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4210: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4220: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4230: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4240: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4250: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
4260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
4270: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
4280: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
4290: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
42a0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
42b0: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
42c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
42d0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
42e0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
42f0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4300: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4310: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4320: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4330: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4340: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
4350: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4360: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
4380: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4390: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
43a0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
43b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
43c0: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
43d0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
43e0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
43f0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4400: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4410: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4420: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4430: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4440: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4450: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4460: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4470: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4480: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
4490: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
44a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
44b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
44c0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
44d0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
44e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
44f0: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4500: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4510: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4520: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4530: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4540: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
4550: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
4560: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
4570: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4580: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
4590: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
45a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
45b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
45c0: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
45d0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
45e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
45f0: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
4600: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
4610: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
4620: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70  >pHaving);.    p
4630: 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a  S = pS->pPrior;.
4640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
4650: 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  k;.}../*.** Retu
4660: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
4670: 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73  iven operator is
4680: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
4690: 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a  ators that is.**
46a0: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20   allowed for an 
46b0: 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20  indexable WHERE 
46c0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68  clause term.  Th
46d0: 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74  e allowed operat
46e0: 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20  ors are.** "=", 
46f0: 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20  "<", ">", "<=", 
4700: 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a  ">=", and "IN"..
4710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
4720: 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b  lowedOp(int op){
4730: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54  .  assert( TK_GT
4740: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c  >TK_EQ && TK_GT<
4750: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
4760: 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26  t( TK_LT>TK_EQ &
4770: 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b  & TK_LT<TK_GE );
4780: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45  .  assert( TK_LE
4790: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c  >TK_EQ && TK_LE<
47a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
47b0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b  t( TK_GE==TK_EQ+
47c0: 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70  4 );.  return op
47d0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d  ==TK_IN || (op>=
47e0: 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f  TK_EQ && op<=TK_
47f0: 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53  GE) || op==TK_IS
4800: 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  NULL;.}../*.** S
4810: 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20  wap two objects 
4820: 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f  of type TYPE..*/
4830: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  .#define SWAP(TY
4840: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
4850: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f  A; A=B; B=t;}../
4860: 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63  *.** Commute a c
4870: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
4880: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
4890: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
48a0: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
48b0: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
48c0: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  p X"..**.** If a
48d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
48e0: 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65  nce is associate
48f0: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68  d with either th
4900: 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a  e left or right.
4910: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
4920: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
4930: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
4940: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
4950: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
4960: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
4970: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
4980: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
4990: 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20   .** "X collate 
49a0: 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68  NOCASE op Y". Th
49b0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
49c0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
49d0: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
49e0: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
49f0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
4a00: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
4a10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
4a20: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
4a30: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
4a40: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
4a50: 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  e EP_ExpCollate 
4a60: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
4a70: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
4a80: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
4a90: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
4aa0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
4ab0: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
4ac0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4ad0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
4ae0: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
4af0: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
4b00: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
4b10: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
4b20: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4b30: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
4b40: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
4b50: 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e  _IN );.  pExpr->
4b60: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20  pRight->pColl = 
4b70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4b80: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
4b90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
4ba0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
4bb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
4bc0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
4bd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53  xpr->pLeft);.  S
4be0: 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78  WAP(CollSeq*,pEx
4bf0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
4c00: 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l,pExpr->pLeft->
4c10: 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d  pColl);.  pExpr-
4c20: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d  >pRight->flags =
4c30: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
4c40: 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70  >flags & ~EP_Exp
4c50: 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65  Collate) | expLe
4c60: 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  ft;.  pExpr->pLe
4c70: 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ft->flags = (pEx
4c80: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
4c90: 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74   & ~EP_ExpCollat
4ca0: 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20  e) | expRight;. 
4cb0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
4cc0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
4cd0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4ce0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
4cf0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
4d00: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
4d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
4d20: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
4d30: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
4d40: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
4d50: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
4d60: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
4d70: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
4d80: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
4d90: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
4da0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
4db0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
4dc0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
4dd0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
4de0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
4df0: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
4e00: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
4e10: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
4e20: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
4e30: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
4e40: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
4e50: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
4e60: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
4e70: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
4e80: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
4e90: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4eb0: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
4ec0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
4ed0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
4ee0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
4ef0: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
4f00: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
4f10: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
4f20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
4f30: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
4f40: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
4f50: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
4f60: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
4f70: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
4f80: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
4f90: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
4fa0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
4fb0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
4fc0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
4fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
4fe0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
4ff0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
5000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
5010: 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74   for a term in t
5020: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5030: 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66  that is of the f
5040: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70  orm "X <op> <exp
5050: 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  r>".** where X i
5060: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
5070: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20   the iColumn of 
5080: 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c  table iCur and <
5090: 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a  op> is one of.**
50a0: 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61   the WO_xx opera
50b0: 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66  tor codes specif
50c0: 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61  ied by the op pa
50d0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75  rameter..** Retu
50e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
50f0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
5100: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
5110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
5120: 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28  eTerm *findTerm(
5130: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
5140: 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pWC,     /* The 
5150: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
5160: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5170: 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
5180: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
5190: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
51a0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
51b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
51c0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  umn number of LH
51d0: 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  S */.  Bitmask n
51e0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
51f0: 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65  RHS must not ove
5200: 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d  rlap with this m
5210: 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c  ask */.  u32 op,
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5230: 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20  * Mask of WO_xx 
5240: 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e  values describin
5250: 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  g operator */.  
5260: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
5270: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
5280: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
5290: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20   this index, if 
52a0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
52b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
52c0: 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73  m;.  int k;.  as
52d0: 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b  sert( iCur>=0 );
52e0: 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b  .  op &= WO_ALL;
52f0: 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
5300: 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72  ->a, k=pWC->nTer
5310: 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d  m; k; k--, pTerm
5320: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  ++){.    if( pTe
5330: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
5340: 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28  iCur.       && (
5350: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
5360: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
5370: 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72  0.       && pTer
5380: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
5390: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
53a0: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
53b0: 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20  ator & op)!=0.  
53c0: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
53d0: 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f  Idx && pTerm->eO
53e0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55  perator!=WO_ISNU
53f0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  LL ){.        Ex
5400: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
5410: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43  pExpr;.        C
5420: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
5430: 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
5440: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ff;.        int 
5450: 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73 65  j;.        Parse
5460: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
5470: 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20  pParse;..       
5480: 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e   idxaff = pIdx->
5490: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
54a0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
54b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
54c0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
54d0: 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20  yOk(pX, idxaff) 
54e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
54f0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
5500: 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ut the collation
5510: 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69 72   sequence requir
5520: 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78  ed from an index
5530: 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   for.        ** 
5540: 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20  it to be useful 
5550: 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65  for optimising e
5560: 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74  xpression pX. St
5570: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20  ore this.       
5580: 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72   ** value in var
5590: 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20  iable pColl..   
55a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
55b0: 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74  assert(pX->pLeft
55c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
55d0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
55e0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
55f0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
5600: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
5610: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 43         assert(pC
5620: 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  oll || pParse->n
5630: 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66  Err);..        f
5640: 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69  or(j=0; pIdx->ai
5650: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
5660: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
5670: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e      if( NEVER(j>
5680: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20  =pIdx->nColumn) 
5690: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
56a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
56b0: 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74  ( pColl && sqlit
56c0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
56d0: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
56e0: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
56f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
5700: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
5710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5720: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
5730: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5750: 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73  prAnalyze(SrcLis
5760: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
5770: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
5780: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
5790: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
57a0: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
57b0: 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69   .**.**.*/.stati
57c0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
57d0: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
57e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
57f0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
5800: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
5810: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
5820: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
5830: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
5840: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
5850: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
5860: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
5870: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
5880: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
5890: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
58a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
58b0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
58c0: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
58d0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
58e0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
58f0: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
5900: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
5910: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
5920: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
5930: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
5940: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
5950: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
5960: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
5970: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
5980: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
5990: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
59a0: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
59b0: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
59c0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
59d0: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
59e0: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
5a00: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
5a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5a20: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5a30: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5a40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
5a50: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
5a60: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
5a70: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
5a80: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
5a90: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
5aa0: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
5ab0: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
5ac0: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
5ad0: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
5ae0: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
5af0: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
5b00: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
5b10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
5b20: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
5b30: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
5b40: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
5b50: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
5b60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
5b70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5b80: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
5b90: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5ba0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
5bb0: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
5bc0: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
5bd0: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
5be0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5bf0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
5c00: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5c10: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
5c20: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
5c30: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
5c60: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
5c70: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
5c80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5c90: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
5ca0: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
5cb0: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
5cc0: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
5cd0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
5ce0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
5cf0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
5d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5d10: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5d20: 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73 71   for LHS */.  sq
5d30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5d40: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
5d50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5d60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
5d70: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
5d80: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
5d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5da0: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
5db0: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
5dc0: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
5dd0: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
5de0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
5df0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
5e00: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
5e10: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
5e20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
5e30: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
5e40: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
5e50: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
5e60: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
5e70: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
5e80: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
5e90: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
5ea0: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
5eb0: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
5ec0: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
5ed0: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
5ee0: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
5ef0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
5f00: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
5f10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5f20: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
5f30: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
5f40: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
5f50: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
5f60: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
5f70: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
5f80: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
5f90: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 20  as AFF_TEXT */. 
5fa0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
5fb0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5fc0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 61 73  se, pLeft);.  as
5fd0: 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d 30 20 29  sert( pColl!=0 )
5fe0: 3b 20 20 2f 2a 20 45 76 65 72 79 20 6e 6f 6e 2d  ;  /* Every non-
5ff0: 49 50 4b 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  IPK column has a
6000: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
6010: 6e 63 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 43  nce */.  if( (pC
6020: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
6030: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c  E_COLL_BINARY ||
6040: 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a 20 20   *pnoCase) &&.  
6050: 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65      (pColl->type
6060: 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  !=SQLITE_COLL_NO
6070: 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61 73  CASE || !*pnoCas
6080: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50  e) ){.    /* IMP
6090: 3a 20 52 2d 30 39 30 30 33 2d 33 32 30 34 36 20  : R-09003-32046 
60a0: 46 6f 72 20 74 68 65 20 47 4c 4f 42 20 6f 70 65  For the GLOB ope
60b0: 72 61 74 6f 72 2c 20 74 68 65 20 63 6f 6c 75 6d  rator, the colum
60c0: 6e 20 6d 75 73 74 20 75 73 65 20 74 68 65 0a 20  n must use the. 
60d0: 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 42 49     ** default BI
60e0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
60f0: 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  equence..    ** 
6100: 49 4d 50 3a 20 52 2d 34 31 34 30 38 2d 32 38 33  IMP: R-41408-283
6110: 30 36 20 46 6f 72 20 74 68 65 20 4c 49 4b 45 20  06 For the LIKE 
6120: 6f 70 65 72 61 74 6f 72 2c 20 69 66 20 63 61 73  operator, if cas
6130: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
6140: 20 6d 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   mode.    ** is 
6150: 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 74 68 65  enabled then the
6160: 20 63 6f 6c 75 6d 6e 20 6d 75 73 74 20 75 73 65   column must use
6170: 20 74 68 65 20 64 65 66 61 75 6c 74 20 42 49 4e   the default BIN
6180: 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  ARY collating.  
6190: 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2c 20 6f    ** sequence, o
61a0: 72 20 69 66 20 63 61 73 65 5f 73 65 6e 73 69 74  r if case_sensit
61b0: 69 76 65 5f 6c 69 6b 65 20 6d 6f 64 65 20 69 73  ive_like mode is
61c0: 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 74   disabled then t
61d0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a  he column.    **
61e0: 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 62 75   must use the bu
61f0: 69 6c 74 2d 69 6e 20 4e 4f 43 41 53 45 20 63 6f  ilt-in NOCASE co
6200: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
6210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
6220: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 52  urn 0;.  }..  pR
6230: 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  ight = pList->a[
6240: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d  0].pExpr;.  op =
6250: 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69   pRight->op;.  i
6260: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
6270: 45 52 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70  ER ){.    op = p
6280: 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a  Right->op2;.  }.
6290: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52    if( op==TK_VAR
62a0: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62  IABLE ){.    Vdb
62b0: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20  e *pReprepare = 
62c0: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
62d0: 72 65 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  re;.    pVal = s
62e0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
62f0: 75 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 70  ue(pReprepare, p
6300: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  Right->iColumn, 
6310: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
6320: 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 26  ;.    if( pVal &
6330: 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
6340: 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49  type(pVal)==SQLI
6350: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
6360: 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c   z = (char *)sql
6370: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6380: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pVal);.    }.   
6390: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
63a0: 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70  armask(pParse->p
63b0: 56 64 62 65 2c 20 70 52 69 67 68 74 2d 3e 69 43  Vdbe, pRight->iC
63c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 61 73 73 65  olumn);.    asse
63d0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
63e0: 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70  TK_VARIABLE || p
63f0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  Right->op==TK_RE
6400: 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73  GISTER );.  }els
6410: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52  e if( op==TK_STR
6420: 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  ING ){.    z = p
6430: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  Right->u.zToken;
6440: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a  .  }.  if( z ){.
6450: 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
6460: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74   while( (c=z[cnt
6470: 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30  ])!=0 && c!=wc[0
6480: 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26  ] && c!=wc[1] &&
6490: 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20   c!=wc[2] ){.   
64a0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
64b0: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26      if( cnt!=0 &
64c0: 26 20 63 21 3d 30 20 26 26 20 32 35 35 21 3d 28  & c!=0 && 255!=(
64d0: 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20  u8)z[cnt-1] ){. 
64e0: 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66       Expr *pPref
64f0: 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f  ix;.      *pisCo
6500: 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d  mplete = z[cnt]=
6510: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
6520: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
6530: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
6540: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
6550: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
6560: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
6570: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
6580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
6590: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
65a0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
65b0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
65c0: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
65d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
65e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
65f0: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
6600: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
6610: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
6620: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
6630: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
6640: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
6650: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
6660: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
6670: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
6680: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
6690: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
66a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
66b0: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
66c0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
66d0: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
66e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
66f0: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
6700: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
6710: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
6720: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
6730: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
6740: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
6750: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
6760: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
6770: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
6780: 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64  I. To workaround
6790: 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 6d   them, add a dum
67a0: 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 68  my OP_Variable h
67b0: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ere..          *
67c0: 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  / .          int
67d0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
67e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
67f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6800: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
6810: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
6820: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
6830: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6840: 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP3(v, sqlite3Vd
6850: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6860: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
6870: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6880: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6890: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r1);.        }. 
68a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
68b0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20  {.      z = 0;. 
68c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
68d0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
68e0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 21  l);.  return (z!
68f0: 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  =0);.}.#endif /*
6900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
6910: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
6920: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
6930: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6940: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ABLE./*.** Check
6950: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
6960: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
6970: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
6980: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c  *.**         col
6990: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a  umn MATCH expr.*
69a0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68  *.** If it is th
69b0: 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  en return TRUE. 
69c0: 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
69d0: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
69e0: 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f   int isMatchOfCo
69f0: 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45  lumn(.  Expr *pE
6a00: 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74  xpr      /* Test
6a10: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
6a20: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
6a30: 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28  t *pList;..  if(
6a40: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46   pExpr->op!=TK_F
6a50: 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72  UNCTION ){.    r
6a60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
6a70: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6a80: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
6a90: 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29 7b  n,"match")!=0 ){
6aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6ab0: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
6ac0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69  pr->x.pList;.  i
6ad0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  f( pList->nExpr!
6ae0: 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =2 ){.    return
6af0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
6b00: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d  ist->a[1].pExpr-
6b10: 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  >op != TK_COLUMN
6b20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6b30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
6b40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6b50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6b60: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
6b70: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78   If the pBase ex
6b80: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
6b90: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
6ba0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
6bb0: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  .** a join, then
6bc0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70   transfer the ap
6bd0: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e  propriate markin
6be0: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76  gs over to deriv
6bf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6c00: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d  id transferJoinM
6c10: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44  arkings(Expr *pD
6c20: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42  erived, Expr *pB
6c30: 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64  ase){.  pDerived
6c40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65  ->flags |= pBase
6c50: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f  ->flags & EP_Fro
6c60: 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65  mJoin;.  pDerive
6c70: 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  d->iRightJoinTab
6c80: 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67  le = pBase->iRig
6c90: 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a  htJoinTable;.}..
6ca0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6cb0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
6cc0: 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65  MIZATION) && !de
6cd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ce0: 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a  T_SUBQUERY)./*.*
6cf0: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
6d00: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
6d10: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52  f two or more OR
6d20: 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75  -connected.** su
6d30: 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a  bterms.  So in:.
6d40: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48  **.**     ... WH
6d50: 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28  ERE  (a=5) AND (
6d60: 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d  b=7 OR c=9 OR d=
6d70: 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a  13) AND (d=13).*
6d80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
6d90: 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e             ^^^^^
6da0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a  ^^^^^^^^^^^^^^^.
6db0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6dc0: 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d  ne analyzes term
6dd0: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d 69  s such as the mi
6de0: 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ddle term in the
6df0: 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a   above example..
6e00: 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d  ** A WhereOrTerm
6e10: 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75   object is compu
6e20: 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65 64  ted and attached
6e30: 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64   to the term und
6e40: 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20  er.** analysis, 
6e50: 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  regardless of th
6e60: 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65  e outcome of the
6e70: 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63   analysis.  Henc
6e80: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  e:.**.**     Whe
6e90: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20  reTerm.wtFlags  
6ea0: 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f   |=  TERM_ORINFO
6eb0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6ec0: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20  m.u.pOrInfo  =  
6ed0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
6ee0: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72 54  located WhereOrT
6ef0: 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a  erm object.**.**
6f00: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
6f10: 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61  analyzed must ha
6f20: 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  ve two or more o
6f30: 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73  f OR-connected s
6f40: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69  ubterms..** A si
6f50: 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67  ngle subterm mig
6f60: 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20 41  ht be a set of A
6f70: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  ND-connected sub
6f80: 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78  -subterms..** Ex
6f90: 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20  amples of terms 
6fa0: 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a  under analysis:.
6fb0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20  **.**     (A)   
6fc0: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74    t1.x=t2.y OR t
6fd0: 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79  1.x=t2.z OR t1.y
6fe0: 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61  =15 OR t1.z=t3.a
6ff0: 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20  +5.**     (B)   
7000: 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70    x=expr1 OR exp
7010: 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a  r2=x OR x=expr3.
7020: 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20 74  **     (C)     t
7030: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e  1.x=t2.y OR (t1.
7040: 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d  x=t2.z AND t1.y=
7050: 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20  15).**     (D)  
7060: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79     x=expr1 OR (y
7070: 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44  >11 AND y<22 AND
7080: 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a   z LIKE '*hello*
7090: 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20  ').**     (E)   
70a0: 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62    (p.a=1 AND q.b
70b0: 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52  =2 AND r.c=3) OR
70c0: 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d   (p.x=4 AND q.y=
70d0: 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a  5 AND r.z=6).**.
70e0: 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a  ** CASE 1:.**.**
70f0: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
7100: 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d   are of the form
7110: 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73 6f   T.C=expr for so
7120: 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  me single column
7130: 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c   of C.** a singl
7140: 65 20 74 61 62 6c 65 20 54 20 28 61 73 20 73 68  e table T (as sh
7150: 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42  own in example B
7160: 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65   above) then cre
7170: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
7180: 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  l.** term that i
7190: 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  s an equivalent 
71a0: 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  IN expression.  
71b0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
71c0: 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62  if the term.** b
71d0: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73  eing analyzed is
71e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d  :.**.**      x =
71f0: 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72   expr1  OR  expr
7200: 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65  2 = x  OR  x = e
7210: 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  xpr3.**.** then 
7220: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7230: 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74  tual term like t
7240: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
7250: 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72  x IN (expr1,expr
7260: 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43  2,expr3).**.** C
7270: 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  ASE 2:.**.** If 
7280: 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65  all subterms are
7290: 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20   indexable by a 
72a0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20  single table T, 
72b0: 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20  then set.**.**  
72c0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70     WhereTerm.eOp
72d0: 65 72 61 74 6f 72 20 20 20 20 20 20 20 20 20 20  erator          
72e0: 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20      =  WO_OR.** 
72f0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
7300: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
7310: 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73  le  |=  the curs
7320: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
7330: 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75  ble T.**.** A su
7340: 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61  bterm is "indexa
7350: 62 6c 65 22 20 69 66 20 69 74 20 69 73 20 6f 66  ble" if it is of
7360: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e   the form.** "T.
7370: 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  C <op> <expr>" w
7380: 68 65 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f  here C is any co
7390: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20  lumn of table T 
73a0: 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20  and .** <op> is 
73b0: 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c  one of "=", "<",
73c0: 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22   "<=", ">", ">="
73d0: 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20  , "IS NULL", or 
73e0: 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65  "IN"..** A subte
73f0: 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78  rm is also index
7400: 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e  able if it is an
7410: 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d   AND of two or m
7420: 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72  ore.** subsubter
7430: 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ms at least one 
7440: 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e 64 65  of which is inde
7450: 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c  xable.  Indexabl
7460: 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72  e AND .** subter
7470: 6d 73 20 68 61 76 65 20 74 68 65 69 72 20 65 4f  ms have their eO
7480: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57  perator set to W
7490: 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68  O_AND and they h
74a0: 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66  ave.** u.pAndInf
74b0: 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d  o set to a dynam
74c0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
74d0: 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62   WhereAndTerm ob
74e0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d  ject..**.** From
74f0: 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f   another point o
7500: 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62  f view, "indexab
7510: 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74  le" means that t
7520: 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64  he subterm could
7530: 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  .** potentially 
7540: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
7550: 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70 70 72  index if an appr
7560: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20 65 78  opriate index ex
7570: 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e  ists..** This an
7580: 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20  alysis does not 
7590: 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68 65 72  consider whether
75a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65   or not the inde
75b0: 78 20 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a  x exists; that.*
75c0: 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  * is something t
75d0: 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20 72  he bestIndex() r
75e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
75f0: 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61  rmine.  This ana
7600: 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f  lysis.** only lo
7610: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
7620: 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69  ubterms appropri
7630: 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  ate for indexing
7640: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c   exist..**.** Al
7650: 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72  l examples A thr
7660: 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c  ough E above all
7670: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e   satisfy case 2.
7680: 20 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a    But if a term.
7690: 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69  ** also statisfi
76a0: 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68 20  es case 1 (such 
76b0: 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68  as B) we know th
76c0: 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  at the optimizer
76d0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20   will.** always 
76e0: 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20 73  prefer case 1, s
76f0: 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 77  o in that case w
7700: 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 63  e pretend that c
7710: 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20  ase 2 is not.** 
7720: 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  satisfied..**.**
7730: 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   It might be the
7740: 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69   case that multi
7750: 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20 69  ple tables are i
7760: 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65  ndexable.  For e
7770: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61  xample,.** (E) a
7780: 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c  bove is indexabl
7790: 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51  e on tables P, Q
77a0: 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54  , and R..**.** T
77b0: 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73 66  erms that satisf
77c0: 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61 6e  y case 2 are can
77d0: 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b  didates for look
77e0: 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73  up by using.** s
77f0: 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 20  eparate indices 
7800: 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66  to find rowids f
7810: 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d 20  or each subterm 
7820: 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a  and composing.**
7830: 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c   the union of al
7840: 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61  l rowids using a
7850: 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20   RowSet object. 
7860: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
7870: 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69  .** to "bitmap i
7880: 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72  ndices" in other
7890: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
78a0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49  s..**.** OTHERWI
78b0: 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  SE:.**.** If nei
78c0: 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20  ther case 1 nor 
78d0: 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68  case 2 apply, th
78e0: 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70  en leave the eOp
78f0: 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a  erator set to.**
7900: 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72   zero.  This ter
7910: 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20  m is not useful 
7920: 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73  for search..*/.s
7930: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
7940: 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20  nalyzeOrTerm(.  
7950: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
7960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
7970: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
7980: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
7990: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
79a0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52  he complete WHER
79b0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
79c0: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
79d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
79e0: 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20   of the OR-term 
79f0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7a00: 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  /.){.  Parse *pP
7a10: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
7a20: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
7a30: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
7a40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
7a50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a70: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
7a80: 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
7a90: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
7aa0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20  C->a[idxTerm];  
7ab0: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
7ac0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7ad0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7ae0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20  pTerm->pExpr;   
7af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
7b10: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65  he term */.  Whe
7b20: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
7b30: 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b  Set = pWC->pMask
7b40: 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73  Set; /* Table us
7b50: 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74  e masks */.  int
7b60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
7b90: 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
7ba0: 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20  Clause *pOrWc;  
7bb0: 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20       /* Breakup 
7bc0: 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75  of pTerm into su
7bd0: 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72  bterms */.  Wher
7be0: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20  eTerm *pOrTerm; 
7bf0: 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74        /* A Sub-t
7c00: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70  erm within the p
7c10: 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f  OrWc */.  WhereO
7c20: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
7c30: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
7c40: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  l information as
7c50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
7c60: 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  erm */.  Bitmask
7c70: 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20   chngToIN;      
7c80: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
7c90: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
7ca0: 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d  case 1 */.  Bitm
7cb0: 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20  ask indexable;  
7cc0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7cd0: 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61 62  that are indexab
7ce0: 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63  le, satisfying c
7cf0: 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ase 2 */..  /*. 
7d00: 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52   ** Break the OR
7d10: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73   clause into its
7d20: 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65 72   separate subter
7d30: 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d  ms.  The subterm
7d40: 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65  s are.  ** store
7d50: 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75  d in a WhereClau
7d60: 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  se structure con
7d70: 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74  taining within t
7d80: 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20  he WhereOrInfo. 
7d90: 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20   ** object that 
7da0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
7db0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63  he original OR c
7dc0: 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f  lause term..  */
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
7de0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
7df0: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f  RM_DYNAMIC|TERM_
7e00: 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49  ORINFO|TERM_ANDI
7e10: 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  NFO))==0 );.  as
7e20: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
7e30: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72  =TK_OR );.  pTer
7e40: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70  m->u.pOrInfo = p
7e50: 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  OrInfo = sqlite3
7e60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7e70: 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f   sizeof(*pOrInfo
7e80: 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66  ));.  if( pOrInf
7e90: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  o==0 ) return;. 
7ea0: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
7eb0: 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a  |= TERM_ORINFO;.
7ec0: 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e    pOrWc = &pOrIn
7ed0: 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43  fo->wc;.  whereC
7ee0: 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c  lauseInit(pOrWc,
7ef0: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
7f00: 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
7f10: 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78  Split(pOrWc, pEx
7f20: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78  pr, TK_OR);.  ex
7f30: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
7f40: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28  c, pOrWc);.  if(
7f50: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7f60: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  d ) return;.  as
7f70: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65  sert( pOrWc->nTe
7f80: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20  rm>=2 );..  /*. 
7f90: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
7fa0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
7fb0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
7fc0: 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20   cases 1 or 2.. 
7fd0: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20   */.  indexable 
7fe0: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
7ff0: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 70 57   chngToIN = ~(pW
8000: 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66 6f 72  C->vmask);.  for
8010: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8020: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
8030: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
8040: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
8050: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
8060: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
8070: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
8080: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
8090: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
80a0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
80b0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
80c0: 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  erator==0 );.   
80d0: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54     assert( (pOrT
80e0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
80f0: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52  TERM_ANDINFO|TER
8100: 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b  M_ORINFO))==0 );
8110: 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20  .      chngToIN 
8120: 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49  = 0;.      pAndI
8130: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
8140: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8150: 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b  eof(*pAndInfo));
8160: 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49  .      if( pAndI
8170: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57  nfo ){.        W
8180: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64  hereClause *pAnd
8190: 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72  WC;.        Wher
81a0: 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b  eTerm *pAndTerm;
81b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
81c0: 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
81d0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
81e0: 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
81f0: 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20  fo = pAndInfo;. 
8200: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8210: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
8220: 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20  ANDINFO;.       
8230: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8240: 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20  tor = WO_AND;.  
8250: 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26        pAndWC = &
8260: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
8270: 20 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73        whereClaus
8280: 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57  eInit(pAndWC, pW
8290: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
82a0: 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68  Set);.        wh
82b0: 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c  ereSplit(pAndWC,
82c0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
82d0: 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20   TK_AND);.      
82e0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
82f0: 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a  (pSrc, pAndWC);.
8300: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8310: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
8320: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ed );.        if
8330: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
8340: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
8350: 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65   for(j=0, pAndTe
8360: 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c  rm=pAndWC->a; j<
8370: 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a  pAndWC->nTerm; j
8380: 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b  ++, pAndTerm++){
8390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
83a0: 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70  ert( pAndTerm->p
83b0: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
83c0: 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f      if( allowedO
83d0: 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  p(pAndTerm->pExp
83e0: 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20 20 20  r->op) ){.      
83f0: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
8400: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
8410: 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  AndTerm->leftCur
8420: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sor);.          
8430: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
8440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8450: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
8460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8470: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
8480: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8490: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 20 20  COPIED ){.      
84a0: 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74 65 72  /* Skip this ter
84b0: 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72  m for now.  We r
84c0: 65 76 69 73 69 74 20 69 74 20 77 68 65 6e 20 77  evisit it when w
84d0: 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a 20 20  e process the.  
84e0: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
84f0: 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54 55 41  ding TERM_VIRTUA
8500: 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65  L term */.    }e
8510: 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  lse{.      Bitma
8520: 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20  sk b;.      b = 
8530: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8540: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
8550: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
8560: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
8570: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
8580: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  L ){.        Whe
8590: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
85a0: 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65   &pOrWc->a[pOrTe
85b0: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
85c0: 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61        b |= getMa
85d0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74  sk(pMaskSet, pOt
85e0: 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  her->leftCursor)
85f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8600: 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a  indexable &= b;.
8610: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
8620: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
8630: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _EQ ){.        c
8640: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8660: 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b    chngToIN &= b;
8670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8680: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
8690: 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f 66 20  cord the set of 
86a0: 74 61 62 6c 65 73 20 74 68 61 74 20 73 61 74 69  tables that sati
86b0: 73 66 79 20 63 61 73 65 20 32 2e 20 20 54 68 65  sfy case 2.  The
86c0: 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20   set might be.  
86d0: 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  ** empty..  */. 
86e0: 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61   pOrInfo->indexa
86f0: 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b  ble = indexable;
8700: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
8710: 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d  tor = indexable=
8720: 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a  =0 ? 0 : WO_OR;.
8730: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54  .  /*.  ** chngT
8740: 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20  oIN holds a set 
8750: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a  of tables that *
8760: 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79 20 63  might* satisfy c
8770: 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a  ase 1.  But.  **
8780: 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73   we have to do s
8790: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  ome additional c
87a0: 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69  hecking to see i
87b0: 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a  f case 1 really.
87c0: 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65    ** is satisfie
87d0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e  d..  **.  ** chn
87e0: 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20  gToIN will hold 
87f0: 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20  either 0, 1, or 
8800: 32 20 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62  2 bits.  The 0-b
8810: 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20  it case means.  
8820: 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ** that there is
8830: 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20   no possibility 
8840: 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  of transforming 
8850: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
8860: 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70  to an.  ** IN op
8870: 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f  erator because o
8880: 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  ne or more terms
8890: 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73   in the OR claus
88a0: 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73  e contain.  ** s
88b0: 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
88c0: 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75  han == on a colu
88d0: 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65  mn in the single
88e0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62   table.  The 1-b
88f0: 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61  it.  ** case mea
8900: 6e 73 20 74 68 61 74 20 65 76 65 72 79 20 74 65  ns that every te
8910: 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61  rm of the OR cla
8920: 75 73 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f  use is of the fo
8930: 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63  rm.  ** "table.c
8940: 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20  olumn=expr" for 
8950: 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c  some single tabl
8960: 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20  e.  The one bit 
8970: 74 68 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a  that is set.  **
8980: 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64   will correspond
8990: 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74   to the common t
89a0: 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20  able.  We still 
89b0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f  need to check to
89c0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
89d0: 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
89e0: 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74  is used on all t
89f0: 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74  erms.  The 2-bit
8a00: 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20   case is when.  
8a10: 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73  ** the all terms
8a20: 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d   are of the form
8a30: 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d   "table1.column=
8a40: 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20  table2.column". 
8a50: 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62   It.  ** might b
8a60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f  e possible to fo
8a70: 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  rm an IN operato
8a80: 72 20 77 69 74 68 20 65 69 74 68 65 72 20 74 61  r with either ta
8a90: 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  ble1.column.  **
8aa0: 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d   or table2.colum
8ab0: 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69 66 20  n as the LHS if 
8ac0: 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e  either is common
8ad0: 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f   to every term o
8ae0: 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c  f.  ** the OR cl
8af0: 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
8b00: 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d 73 20  Note that terms 
8b10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62  of the form "tab
8b20: 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65  le.column1=table
8b30: 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20  .column2" (the. 
8b40: 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f   ** same table o
8b50: 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20  n both sizes of 
8b60: 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62  the ==) cannot b
8b70: 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a  e optimized..  *
8b80: 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e  /.  if( chngToIN
8b90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f   ){.    int okTo
8ba0: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20  ChngToIN = 0;   
8bb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
8bc0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49   conversion to I
8bd0: 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  N is valid */.  
8be0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20    int iColumn = 
8bf0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  -1;         /* C
8c00: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c  olumn index on l
8c10: 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  hs of IN operato
8c20: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75  r */.    int iCu
8c30: 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20  rsor = -1;      
8c40: 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73     /* Table curs
8c50: 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  or common to all
8c60: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e   terms */.    in
8c70: 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  t j = 0;        
8c80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8c90: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20  counter */..    
8ca0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
8cb0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8cc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e   that appears on
8cd0: 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65   one side or the
8ce0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66  .    ** other of
8cf0: 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72   the == operator
8d00: 20 69 6e 20 65 76 65 72 79 20 73 75 62 74 65 72   in every subter
8d10: 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 61  m.  That table a
8d20: 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a  nd column.    **
8d30: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
8d40: 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64  d in iCursor and
8d50: 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65   iColumn.  There
8d60: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e   might not be an
8d70: 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61  y.    ** such ta
8d80: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20  ble and column. 
8d90: 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49   Set okToChngToI
8da0: 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69  N if an appropri
8db0: 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ate table.    **
8dc0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66   and column is f
8dd0: 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f  ound but leave o
8de0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73  kToChngToIN fals
8df0: 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  e if not found..
8e00: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a      */.    for(j
8e10: 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f  =0; j<2 && !okTo
8e20: 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a  ChngToIN; j++){.
8e30: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20        pOrTerm = 
8e40: 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20  pOrWc->a;.      
8e50: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8e60: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  rm-1; i>=0; i--,
8e70: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
8e80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
8e90: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
8ea0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
8eb0: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
8ec0: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
8ed0: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
8ee0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8ef0: 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or==iCursor ){. 
8f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
8f10: 20 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61   is the 2-bit ca
8f20: 73 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e  se and we are on
8f30: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
8f40: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
8f50: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
8f60: 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20  erm is from the 
8f70: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e  first iteration.
8f80: 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74    So skip this t
8f90: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
8fa0: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29    assert( j==1 )
8fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8fc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8fd0: 20 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e          if( (chn
8fe0: 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28  gToIN & getMask(
8ff0: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  pMaskSet, pOrTer
9000: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d  m->leftCursor))=
9010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9020: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73  /* This term mus
9030: 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
9040: 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72   t1.a==t2.b wher
9050: 65 20 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20  e t2 is in the. 
9060: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67           ** chng
9070: 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74 31 20  ToIN set but t1 
9080: 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65  is not.  This te
9090: 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65  rm will be eithe
90a0: 72 20 70 72 65 63 65 65 64 65 64 0a 20 20 20 20  r preceeded.    
90b0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c        ** or foll
90c0: 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74  wed by an invert
90d0: 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74  ed copy (t2.b==t
90e0: 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73  1.a).  Skip this
90f0: 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20   term .         
9100: 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20   ** and use its 
9110: 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20  inversion. */.  
9120: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9130: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
9140: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
9150: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
9160: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9170: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9180: 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
9190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
91a0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
91b0: 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52  (TERM_COPIED|TER
91c0: 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20  M_VIRTUAL) );.  
91d0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
91e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
91f0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f      iColumn = pO
9200: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
9210: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75  umn;.        iCu
9220: 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  rsor = pOrTerm->
9230: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
9240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9250: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30   }.      if( i<0
9260: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
9270: 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  o candidate tabl
9280: 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75  e+column was fou
9290: 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  nd.  This can on
92a0: 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20  ly occur.       
92b0: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e   ** on the secon
92c0: 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  d iteration */. 
92d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
92e0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
92f0: 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f 49 4e  ssert( (chngToIN
9300: 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d  &(chngToIN-1))==
9310: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
9320: 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67  ert( chngToIN==g
9330: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
9340: 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20   iCursor) );.   
9350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9360: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
9370: 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20  se( j==1 );..   
9380: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 66 6f     /* We have fo
9390: 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74 65 20  und a candidate 
93a0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
93b0: 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
93c0: 69 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  if that.      **
93d0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
93e0: 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65  n is common to e
93f0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
9400: 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   OR clause */.  
9410: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
9420: 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
9430: 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68  ; i>=0 && okToCh
9440: 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72  ngToIN; i--, pOr
9450: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
9460: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9470: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
9480: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQ );.        if
9490: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
94a0: 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20 29  ursor!=iCursor )
94b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 54  {.          pOrT
94c0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
94d0: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
94e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
94f0: 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  OrTerm->u.leftCo
9500: 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn!=iColumn ){
9510: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43  .          okToC
9520: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
9530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9540: 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c 65 66        int affLef
9550: 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20 20  t, affRight;.   
9560: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
9570: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9580: 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d   is also a colum
9590: 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  n, then the affi
95a0: 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20 20 20  nities.         
95b0: 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69 67 68   ** of both righ
95c0: 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73  t and left sides
95d0: 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74 68   must be such th
95e0: 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20 20 20  at no type.     
95f0: 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69       ** conversi
9600: 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ons are required
9610: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20   on the right.  
9620: 28 54 69 63 6b 65 74 20 23 32 32 34 39 29 0a 20  (Ticket #2249). 
9630: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
9640: 20 20 20 20 20 20 61 66 66 52 69 67 68 74 20 3d        affRight =
9650: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
9660: 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45  nity(pOrTerm->pE
9670: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9680: 20 20 20 20 20 20 20 20 61 66 66 4c 65 66 74 20          affLeft 
9690: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
96a0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
96b0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
96c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 52          if( affR
96d0: 69 67 68 74 21 3d 30 20 26 26 20 61 66 66 52 69  ight!=0 && affRi
96e0: 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a  ght!=affLeft ){.
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b 54 6f              okTo
9700: 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  ChngToIN = 0;.  
9710: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9720: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65             pOrTe
9730: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
9740: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
9750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9770: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
9780: 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f  oint, okToChngTo
9790: 49 4e 20 69 73 20 74 72 75 65 20 69 66 20 6f 72  IN is true if or
97a0: 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73 61 74  iginal pTerm sat
97b0: 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20 63 61  isfies.    ** ca
97c0: 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74 20 63  se 1.  In that c
97d0: 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74 20 61  ase, construct a
97e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
97f0: 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20 20 2a  m that is .    *
9800: 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72 74 65  * pTerm converte
9810: 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  d into an IN ope
9820: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
9830: 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f    if( okToChngTo
9840: 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  IN ){.      Expr
9850: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
9860: 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e     /* A transien
9870: 74 20 64 75 70 6c 69 63 61 74 65 20 65 78 70 72  t duplicate expr
9880: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
9890: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
98a0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 52 48  = 0;   /* The RH
98b0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
98c0: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
98d0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20  pr *pLeft = 0;  
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20       /* The LHS 
98f0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
9900: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  or */.      Expr
9910: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9920: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
9930: 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  te IN operator *
9940: 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  /..      for(i=p
9950: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70  OrWc->nTerm-1, p
9960: 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b  OrTerm=pOrWc->a;
9970: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
9980: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
9990: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  if( (pOrTerm->wt
99a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  Flags & TERM_OR_
99b0: 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  OK)==0 ) continu
99c0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
99d0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
99e0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
99f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9a00: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
9a10: 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a  sor==iCursor );.
9a20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9a30: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
9a40: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
9a50: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
9a60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9a70: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
9a80: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
9a90: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
9aa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9ab0: 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73  ppend(pWC->pPars
9ac0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
9ad0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
9ae0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9af0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
9b00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9b10: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
9b20: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9b30: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
9b40: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20   0);.      pNew 
9b50: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9b60: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44  Parse, TK_IN, pD
9b70: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
9b80: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
9b90: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
9ba0: 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65  .        transfe
9bb0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e  rJoinMarkings(pN
9bc0: 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
9bd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9be0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
9bf0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
9c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
9c10: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
9c20: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
9c30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
9c40: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
9c50: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
9c60: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
9c70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
9c80: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
9c90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
9ca0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
9cb0: 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  w);.        pTer
9cc0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
9cd0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57  erm];.        pW
9ce0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61  C->a[idxNew].iPa
9cf0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
9d00: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
9d10: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
9d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9d30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9d40: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
9d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d60: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
9d70: 20 3d 20 30 3b 20 20 2f 2a 20 63 61 73 65 20 31   = 0;  /* case 1
9d80: 20 74 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a   trumps case 2 *
9d90: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  /.    }.  }.}.#e
9da0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
9db0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
9dc0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
9dd0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
9de0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  .../*.** The inp
9df0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
9e00: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
9e10: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
9e20: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
9e30: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
9e40: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
9e50: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9e60: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
9e70: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
9e80: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
9e90: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
9ea0: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
9eb0: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
9ec0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
9ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
9ee0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
9ef0: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
9f00: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
9f10: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
9f20: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
9f30: 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66  expr>"..**.** If
9f40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f50: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9f60: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
9f70: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
9f80: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  .** columns, the
9f90: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  n the original e
9fa0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
9fb0: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
9fc0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d   virtual.** term
9fd0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20   of the form "Y 
9fe0: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
9ff0: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
a000: 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ause and.** anal
a010: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
a020: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
a030: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
a040: 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a  th TERM_COPIED.*
a050: 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65  * and the new te
a060: 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  rm is marked wit
a070: 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28  h TERM_DYNAMIC (
a080: 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 78  because it's pEx
a090: 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  pr.** needs to b
a0a0: 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 65  e freed with the
a0b0: 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e   WhereClause) an
a0c0: 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28  d TERM_VIRTUAL (
a0d0: 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73  because it.** is
a0e0: 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79   a commuted copy
a0f0: 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d   of a prior term
a100: 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .)  The original
a110: 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64   term has nChild
a120: 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  =1.** and the co
a130: 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e 74  py has idxParent
a140: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
a150: 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  x of the origina
a160: 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  l term..*/.stati
a170: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
a180: 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ze(.  SrcList *p
a190: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
a1a0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
a1b0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
a1c0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
a1d0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
a1e0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
a1f0: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
a200: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
a210: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
a220: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
a230: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a240: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
a250: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f    /* The term to
a260: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
a270: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
a280: 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20  pMaskSet;       
a290: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62     /* Set of tab
a2a0: 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a  le index masks *
a2b0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  /.  Expr *pExpr;
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a2e0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
a2f0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61  lyzed */.  Bitma
a300: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20  sk prereqLeft;  
a310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a320: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
a330: 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  the pExpr->pLeft
a340: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
a350: 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20  ereqAll;        
a360: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
a370: 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72  uesites of pExpr
a380: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
a390: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20  traRight = 0;   
a3a0: 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 45         /* */.  E
a3b0: 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20  xpr *pStr1 = 0; 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
a3e0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
a3f0: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
a400: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a410: 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b     /* RHS of LIK
a420: 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68  E/GLOB ends with
a430: 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69   wildcard */.  i
a440: 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20  nt noCase = 0;  
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 2f 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73  /* LIKE/GLOB dis
a470: 74 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20  tinguishes case 
a480: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76        /* Top-lev
a4b0: 65 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45  el operator.  pE
a4c0: 78 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72  xpr->op */.  Par
a4d0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
a4e0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
a4f0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a500: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
a510: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
a520: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a530: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
a540: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
a550: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
a570: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a580: 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53  xTerm];.  pMaskS
a590: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
a5a0: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
a5b0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72  erm->pExpr;.  pr
a5c0: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
a5d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
a5e0: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
a5f0: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
a600: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
a610: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
a620: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
a630: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
a640: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a650: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
a660: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54  ect) ){.      pT
a670: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a680: 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   = exprSelectTab
a690: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
a6a0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
a6b0: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
a6c0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
a6d0: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
a6e0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
a6f0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78  askSet, pExpr->x
a700: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
a710: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
a720: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
a730: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
a740: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
a750: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
a760: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
a770: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
a780: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
a790: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
a7a0: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
a7b0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
a7c0: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
a7d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a7e0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
a7f0: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
a800: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
a810: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
a820: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
a830: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
a840: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
a850: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
a860: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
a870: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
a880: 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20   an index.      
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
a8b0: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
a8c0: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
a8d0: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
a8e0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
a8f0: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
a900: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
a910: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
a920: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
a930: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
a940: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
a950: 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70  op) && (pTerm->p
a960: 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65  rereqRight & pre
a970: 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20  reqLeft)==0 ){. 
a980: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
a990: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
a9a0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
a9b0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
a9c0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
a9d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
a9e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
a9f0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
aa00: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
aa10: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
aa20: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
aa30: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72  lumn;.      pTer
aa40: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f  m->eOperator = o
aa50: 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b  peratorMask(op);
aa60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
aa70: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
aa80: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
aa90: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
aaa0: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
aab0: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
aac0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
aad0: 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20  Cursor>=0 ){.   
aae0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
aaf0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
ab00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ab10: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
ab20: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
ab30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ab40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ab50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44  xprDelete(db, pD
ab60: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  up);.          r
ab70: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
ab80: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
ab90: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
aba0: 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54  ert(pWC, pDup, T
abb0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
abc0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
abd0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30     if( idxNew==0
abe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
abf0: 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e     pNew = &pWC->
ac00: 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20  a[idxNew];.     
ac10: 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74     pNew->iParent
ac20: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
ac30: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
ac40: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
ac50: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
ac60: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ild = 1;.       
ac70: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
ac80: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
ac90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aca0: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
acb0: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
acc0: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
acd0: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
ace0: 74 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29  te(pParse, pDup)
acf0: 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
ad00: 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  pDup->pLeft;.   
ad10: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72     pNew->leftCur
ad20: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
ad30: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ble;.      pNew-
ad40: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
ad50: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
ad60: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
ad70: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
ad80: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
ad90: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
ada0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
adb0: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
adc0: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
add0: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
ade0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
adf0: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
ae00: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
ae10: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
ae20: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
ae30: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
ae40: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
ae50: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
ae60: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
ae70: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
ae80: 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65  plements.  For e
ae90: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
aea0: 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e  *      a BETWEEN
aeb0: 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20   b AND c.  **.  
aec0: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
aed0: 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
aee0: 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20       (a BETWEEN 
aef0: 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e  b AND c) AND (a>
af00: 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20  =b) AND (a<=c). 
af10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f   **.  ** The two
af20: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61   new terms are a
af30: 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  dded onto the en
af40: 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c  d of the WhereCl
af50: 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  ause object..  *
af60: 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20  * The new terms 
af70: 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e  are "dynamic" an
af80: 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f  d are children o
af90: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42  f the original B
afa0: 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d  ETWEEN.  ** term
afb0: 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
afc0: 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45  at if the BETWEE
afd0: 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c  N term is coded,
afe0: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
aff0: 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20  e.  ** skipped. 
b000: 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c   Or, if the chil
b010: 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69  dren are satisfi
b020: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20  ed by an index, 
b030: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
b040: 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  * BETWEEN term i
b050: 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  s skipped..  */.
b060: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
b070: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
b080: 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f   && pWC->op==TK_
b090: 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  AND ){.    ExprL
b0a0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b0b0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
b0c0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
b0d0: 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b  ic const u8 ops[
b0e0: 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c  ] = {TK_GE, TK_L
b0f0: 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E};.    assert( 
b100: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
b110: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
b120: 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66  Expr==2 );.    f
b130: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
b140: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b150: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69  NewExpr;.      i
b160: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
b170: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b180: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b190: 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20   ops[i], .      
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b1c0: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d  prDup(db, pExpr-
b1d0: 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20  >pLeft, 0),.    
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b200: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73  ExprDup(db, pLis
b210: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30  t->a[i].pExpr, 0
b220: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
b230: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
b240: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b250: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
b260: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b270: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b280: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
b290: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
b2a0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
b2b0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
b2c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b2d0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
b2e0: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
b2f0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b300: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
b310: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
b320: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b330: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
b340: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b350: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b360: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
b370: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
b380: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b390: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
b3a0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
b3b0: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
b3c0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
b3d0: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
b3e0: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
b3f0: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
b400: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
b410: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
b420: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
b430: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
b440: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
b450: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
b460: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
b470: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
b480: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
b490: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
b4a0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
b4b0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b4c0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
b4d0: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
b4e0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
b4f0: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
b500: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
b510: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
b520: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
b530: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
b540: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
b550: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
b560: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
b570: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
b580: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
b590: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
b5a0: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
b5b0: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
b5c0: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
b5d0: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
b5e0: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
b5f0: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
b600: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
b610: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
b620: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
b630: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
b640: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
b650: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
b660: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
b670: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
b680: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
b690: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
b6a0: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b6b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b6c0: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
b6d0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
b6e0: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
b6f0: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
b700: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
b710: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
b720: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
b730: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
b740: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 0a 20   int idxNew2;.. 
b750: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
b760: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
b770: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32  pExpr;.    pStr2
b780: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b790: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b  p(db, pStr1, 0);
b7a0: 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  .    if( !db->ma
b7b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b7c0: 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20      u8 c, *pC;  
b7d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61       /* Last cha
b7e0: 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68  racter before th
b7f0: 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64  e first wildcard
b800: 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28   */.      pC = (
b810: 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54  u8*)&pStr2->u.zT
b820: 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c  oken[sqlite3Strl
b830: 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54  en30(pStr2->u.zT
b840: 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20  oken)-1];.      
b850: 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69  c = *pC;.      i
b860: 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20  f( noCase ){.   
b870: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
b880: 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e  t is to incremen
b890: 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61  t the last chara
b8a0: 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  cter before the 
b8b0: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
b8c0: 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20   wildcard.  But 
b8d0: 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20  if we increment 
b8e0: 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70  '@', that will p
b8f0: 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  ush it into the.
b900: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61          ** alpha
b910: 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72  betic range wher
b920: 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f  e case conversio
b930: 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20  ns will mess up 
b940: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
b950: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20  inequality.  To 
b960: 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65  avoid this, make
b970: 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75   sure to also ru
b980: 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20  n the full.     
b990: 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c     ** LIKE on al
b9a0: 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  l candidate expr
b9b0: 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72  essions by clear
b9c0: 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65  ing the isComple
b9d0: 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20  te flag.        
b9e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  */.        if( c
b9f0: 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70  =='A'-1 ) isComp
ba00: 6c 65 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lete = 0;..     
ba10: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70     c = sqlite3Up
ba20: 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20  perToLower[c];. 
ba30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43       }.      *pC
ba40: 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = c + 1;.    }.
ba50: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
ba60: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
ba70: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c 69  rse, TK_GE, sqli
ba80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
ba90: 65 66 74 2c 30 29 2c 70 53 74 72 31 2c 30 29 3b  eft,0),pStr1,0);
baa0: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
bab0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
bac0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
bad0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
bae0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
baf0: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
bb00: 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
bb10: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
bb20: 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
bb30: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
bb40: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bb50: 65 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65  e, TK_LT, sqlite
bb60: 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66  3ExprDup(db,pLef
bb70: 74 2c 30 29 2c 70 53 74 72 32 2c 30 29 3b 0a 20  t,0),pStr2,0);. 
bb80: 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
bb90: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
bba0: 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
bbb0: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
bbc0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
bbd0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
bbe0: 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
bbf0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
bc00: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
bc10: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
bc20: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
bc30: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
bc40: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
bc50: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
bc60: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
bc70: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
bc80: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
bc90: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
bca0: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
bcb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
bcc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
bcd0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
bce0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bcf0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bd00: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
bd10: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
bd20: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
bd30: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
bd40: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
bd50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
bd60: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
bd70: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
bd80: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
bd90: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
bda0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
bdb0: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
bdc0: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
bdd0: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
bde0: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
bdf0: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
be00: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
be10: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
be20: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
be30: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
be40: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
be50: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
be60: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
be70: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
be80: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
be90: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
bea0: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
beb0: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
bec0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
bed0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
bee0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
bef0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
bf00: 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
bf10: 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
bf20: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
bf30: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
bf40: 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
bf50: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
bf60: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
bf70: 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
bf80: 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
bf90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
bfa0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
bfb0: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
bfc0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
bfd0: 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20  , TK_MATCH, .   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
c000: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c010: 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
c020: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
c030: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c040: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
c050: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
c060: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
c070: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
c080: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
c090: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
c0a0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
c0b0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
c0c0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
c0d0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
c0e0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
c0f0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
c100: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c110: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
c120: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
c130: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c140: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
c150: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
c160: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
c170: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
c180: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
c190: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
c1a0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
c1b0: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
c1c0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
c1d0: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
c1e0: 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
c1f0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
c200: 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
c210: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c220: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c230: 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76  LE */..  /* Prev
c240: 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65  ent ON clause te
c250: 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  rms of a LEFT JO
c260: 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73  IN from being us
c270: 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a  ed to drive.  **
c280: 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61   an index for ta
c290: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
c2a0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
c2b0: 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  */.  pTerm->prer
c2c0: 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61  eqRight |= extra
c2d0: 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Right;.}../*.** 
c2e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
c2f0: 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ny of the expres
c300: 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e  sions in pList->
c310: 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e  a[iFirst...] con
c320: 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65  tain.** a refere
c330: 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65  nce to any table
c340: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
c350: 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  iBase table..*/.
c360: 73 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72  static int refer
c370: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
c380: 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  (.  ExprList *pL
c390: 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ist,          /*
c3a0: 20 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69   Search expressi
c3b0: 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20  ons in ths list 
c3c0: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
c3d0: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f  t *pMaskSet,   /
c3e0: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
c3f0: 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73  ables to bitmaps
c400: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
c410: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c420: 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20  /* Be searching 
c430: 77 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d  with the iFirst-
c440: 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
c450: 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20  .  int iBase    
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c470: 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65  Ignore reference
c480: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
c490: 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  */.){.  Bitmask 
c4a0: 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61  allowed = ~getMa
c4b0: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61  sk(pMaskSet, iBa
c4c0: 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46  se);.  while( iF
c4d0: 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  irst<pList->nExp
c4e0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78  r ){.    if( (ex
c4f0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c500: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
c510: 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29  iFirst++].pExpr)
c520: 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a  &allowed)!=0 ){.
c530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
c540: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c550: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
c560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63  This routine dec
c570: 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ides if pIdx can
c580: 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69   be used to sati
c590: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
c5a0: 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20  .** clause.  If 
c5b0: 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72  it can, it retur
c5c0: 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63  ns 1.  If pIdx c
c5d0: 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  annot satisfy th
c5e0: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  e.** ORDER BY cl
c5f0: 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ause, this routi
c600: 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  ne returns 0..**
c610: 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
c620: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
c630: 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  se from a SELECT
c640: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61   statement.  pTa
c650: 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74  b is the.** left
c660: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74  -most table in t
c670: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
c680: 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45  f that same SELE
c690: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
c6a0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61  .** the table ha
c6b0: 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
c6c0: 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49  r of "base".  pI
c6d0: 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  dx is an index o
c6e0: 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45  n pTab..**.** nE
c6f0: 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  qCol is the numb
c700: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
c710: 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75   pIdx that are u
c720: 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a  sed as equality.
c730: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ** constraints. 
c740: 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f   Any of these co
c750: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73  lumns may be mis
c760: 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52  sing from the OR
c770: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
c780: 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63   and the match c
c790: 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75  an still be a su
c7a0: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ccess..**.** All
c7b0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
c7c0: 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63  DER BY that matc
c7d0: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  h against the in
c7e0: 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68  dex must be eith
c7f0: 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53  er.** ASC or DES
c800: 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68  C.  (Terms of th
c810: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c820: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
c830: 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e  f a UNIQUE.** in
c840: 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  dex do not need 
c850: 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20  to satisfy this 
c860: 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68  constraint.)  Th
c870: 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69  e *pbRev value i
c880: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66  s.** set to 1 if
c890: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c8a0: 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43  ause is all DESC
c8b0: 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74   and it is set t
c8c0: 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52  o 0 if.** the OR
c8d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
c8e0: 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61   all ASC..*/.sta
c8f0: 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e  tic int isSortin
c900: 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  gIndex(.  Parse 
c910: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
c920: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c930: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  text */.  WhereM
c940: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
c950: 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f  , /* Mapping fro
c960: 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e  m table cursor n
c970: 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70  umbers to bitmap
c980: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
c990: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx,            /
c9a0: 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61  * The index we a
c9b0: 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20  re testing */.  
c9c0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
c9e0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
c9f0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
ca00: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
ca10: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
ca20: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
ca30: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
ca40: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
ca50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ca60: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
ca70: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
ca80: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
ca90: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
caa0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
cab0: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
cac0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
cad0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
cae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
caf0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
cb00: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30  nt sortOrder = 0
cb10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
cb20: 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61  * XOR of index a
cb30: 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  nd ORDER BY sort
cb40: 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20   direction */.  
cb50: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
cb80: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
cb90: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
cba0: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20  _item *pTerm;   
cbb0: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
cbc0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
cbd0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
cbe0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cbf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
cc00: 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65  erBy!=0 );.  nTe
cc10: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  rm = pOrderBy->n
cc20: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
cc30: 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a  nTerm>0 );..  /*
cc40: 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20 6d   Argument pIdx m
cc50: 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74  ust either point
cc60: 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61 6d   to a 'real' nam
cc70: 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  ed index structu
cc80: 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e 20  re, .  ** or an 
cc90: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
cca0: 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
ccb0: 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42 74   stack by bestBt
ccc0: 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20 20  reeIndex() to.  
ccd0: 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ** represent the
cce0: 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68 61   rowid index tha
ccf0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76 65  t is part of eve
cd00: 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ry table.  */.  
cd10: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a 4e  assert( pIdx->zN
cd20: 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43  ame || (pIdx->nC
cd30: 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78  olumn==1 && pIdx
cd40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 2d  ->aiColumn[0]==-
cd50: 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63  1) );..  /* Matc
cd60: 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  h terms of the O
cd70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
cd80: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  gainst columns o
cd90: 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  f.  ** the index
cda0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
cdb0: 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68 61   that indices ha
cdc0: 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ve pIdx->nColumn
cdd0: 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73   regular columns
cde0: 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61   plus.  ** one a
cdf0: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
ce00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ce10: 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77 69  rowid.  The rowi
ce20: 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66  d column.  ** of
ce30: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6c   the index is al
ce40: 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  so allowed to ma
ce50: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  tch against the 
ce60: 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
ce70: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ause..  */.  for
ce80: 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f  (i=j=0, pTerm=pO
ce90: 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65  rderBy->a; j<nTe
cea0: 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e  rm && i<=pIdx->n
ceb0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
cec0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
ced0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
cee0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52  ession of the OR
cef0: 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a  DER BY pTerm */.
cf00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
cf10: 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ll;    /* The co
cf20: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
cf30: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 20   of pExpr */.   
cf40: 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72 64   int termSortOrd
cf50: 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65  er; /* Sort orde
cf60: 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  r for this term 
cf70: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  */.    int iColu
cf80: 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  mn;       /* The
cf90: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i-th column of 
cfa0: 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20 66  the index.  -1 f
cfb0: 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  or rowid */.    
cfc0: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b 20  int iSortOrder; 
cfd0: 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53 43     /* 1 for DESC
cfe0: 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20 74  , 0 for ASC on t
cff0: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  he i-th index te
d000: 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  rm */.    const 
d010: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20  char *zColl; /* 
d020: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c  Name of the coll
d030: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
d040: 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74 65  or i-th index te
d050: 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72  rm */..    pExpr
d060: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
d070: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
d080: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
d090: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
d0a0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  base ){.      /*
d0b0: 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20   Can not use an 
d0c0: 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e  index sort on an
d0d0: 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e  ything that is n
d0e0: 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ot a column in t
d0f0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74  he.      ** left
d100: 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74  -most table of t
d110: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
d120: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
d130: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
d140: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d150: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
d160: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  r);.    if( !pCo
d170: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
d180: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
d190: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
d1a0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26 20   pIdx->zName && 
d1b0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  i<pIdx->nColumn 
d1c0: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
d1d0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
d1e0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
d1f0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
d200: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a  Table->iPKey ){.
d210: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
d220: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
d230: 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d      iSortOrder =
d240: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d250: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  r[i];.      zCol
d260: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
d270: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
d280: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
d290: 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f  -1;.      iSortO
d2a0: 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rder = 0;.      
d2b0: 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a  zColl = pColl->z
d2c0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Name;.    }.    
d2d0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
d2e0: 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73  mn!=iColumn || s
d2f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
d300: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  oll->zName, zCol
d310: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  l) ){.      /* T
d320: 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44  erm j of the ORD
d330: 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  ER BY clause doe
d340: 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75  s not match colu
d350: 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65  mn i of the inde
d360: 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  x */.      if( i
d370: 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  <nEqCol ){.     
d380: 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65     /* If an inde
d390: 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  x column that is
d3a0: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
d3b0: 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  == fails to matc
d3c0: 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  h an.        ** 
d3d0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74  ORDER BY term, t
d3e0: 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74  hat is OK.  Just
d3f0: 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c   ignore that col
d400: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
d410: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d420: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
d430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3d      }else if( i=
d440: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
d450: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  {.        /* Ind
d460: 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74  ex column i is t
d470: 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f  he rowid.  All o
d480: 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63 68  ther terms match
d490: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
d4a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
d4b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
d4c0: 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66  n index column f
d4d0: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
d4e0: 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61  d is not constra
d4f0: 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20  ined by ==.     
d500: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69     ** then the i
d510: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  ndex cannot sati
d520: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
d530: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20   constraint..   
d540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
d550: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d560: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
d570: 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
d580: 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c 75  rder!=0 || iColu
d590: 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73  mn==-1 );.    as
d5a0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
d5b0: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
d5c0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
d5d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d5e0: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
d5f0: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
d600: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
d610: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
d620: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
d630: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
d640: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
d650: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
d660: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
d670: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
d680: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
d690: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
d6a0: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
d6b0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
d6c0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d6d0: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
d6e0: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
d6f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d700: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
d720: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
d730: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
d740: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
d750: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
d760: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
d770: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
d780: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
d790: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
d7a0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
d7b0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
d7c0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d7d0: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
d7e0: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
d7f0: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
d800: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d810: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
d820: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
d830: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
d840: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
d850: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
d860: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
d870: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
d880: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
d890: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
d8a0: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
d8b0: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
d8c0: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
d8d0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
d8e0: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
d8f0: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
d900: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
d910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
d920: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
d930: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
d940: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
d950: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
d960: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
d970: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
d980: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
d990: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
d9a0: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
d9b0: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
d9c0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
d9d0: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
d9e0: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
d9f0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
da00: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
da10: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
da20: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
da30: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
da40: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
da50: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
da60: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
da70: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
da80: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
da90: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
daa0: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
dab0: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
dac0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
dad0: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
dae0: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
daf0: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
db00: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
db10: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
db20: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
db30: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
db40: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
db50: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
db60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  0;.}../*.** Prep
db70: 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69  are a crude esti
db80: 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61  mate of the loga
db90: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
dba0: 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  ut value..** The
dbb0: 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f   results need no
dbc0: 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69  t be exact.  Thi
dbd0: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
dbe0: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a  or estimating.**
dbf0: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20   the total cost 
dc00: 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70  of performing op
dc10: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28  erations with O(
dc20: 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e  logN) or O(NlogN
dc30: 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e  ).** complexity.
dc40: 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a    Because N is j
dc50: 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20  ust a guess, it 
dc60: 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67  is no great trag
dc70: 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69  edy if.** logN i
dc80: 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a  s a little off..
dc90: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
dca0: 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e   estLog(double N
dcb0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  ){.  double logN
dcc0: 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78   = 1;.  double x
dcd0: 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20   = 10;.  while( 
dce0: 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20  N>x ){.    logN 
dcf0: 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31  += 1;.    x *= 1
dd00: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
dd10: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  logN;.}../*.** T
dd20: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
dd30: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
dd40: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
dd50: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
dd60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
dd70: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
dd80: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
dd90: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
dda0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
ddb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
ddc0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
ddd0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
dde0: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
ddf0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
de00: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
de10: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
de20: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
de30: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
de40: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
de50: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
de60: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
de70: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
de80: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
de90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
dea0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
deb0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
dec0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
ded0: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
dee0: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
def0: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
df00: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
df10: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
df20: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
df30: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
df40: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
df50: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
df60: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
df70: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
df80: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
df90: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
dfa0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
dfb0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
dfc0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
dfd0: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
dfe0: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
dff0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
e000: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
e010: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
e020: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
e030: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
e040: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
e050: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
e060: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e070: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e080: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
e090: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
e0a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
e0b0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
e0c0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e0d0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
e0e0: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
e0f0: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
e100: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
e110: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
e120: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
e130: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
e140: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
e150: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
e160: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
e170: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
e180: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
e190: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
e1a0: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
e1b0: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
e1c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e1d0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
e1e0: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
e1f0: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
e200: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
e210: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
e220: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
e230: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
e240: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
e250: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
e260: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
e270: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e280: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  S(A).#endif../* 
e290: 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65 63  .** Required bec
e2a0: 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28 29  ause bestIndex()
e2b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65   is called by be
e2c0: 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
e2d0: 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ) .*/.static voi
e2e0: 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 20  d bestIndex(.   
e2f0: 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43 6c   Parse*, WhereCl
e300: 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53 72  ause*, struct Sr
e310: 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 20 42 69 74  cList_item*, Bit
e320: 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c  mask, ExprList*,
e330: 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f   WhereCost*);../
e340: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e350: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  e attempts to fi
e360: 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73  nd an scanning s
e370: 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e  trategy that can
e380: 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
e390: 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27  optimize an 'OR'
e3a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
e3b0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48   is part of a WH
e3c0: 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a  ERE clause. .**.
e3d0: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73  ** The table ass
e3e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f  ociated with FRO
e3f0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53  M clause term pS
e400: 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  rc may be either
e410: 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d   a.** regular B-
e420: 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20  Tree table or a 
e430: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
e440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
e450: 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
e460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e480: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
e490: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e4a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
e4b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
e4c0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
e4d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e4e0: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
e4f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
e500: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
e510: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
e520: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
e530: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
e540: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
e550: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
e560: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
e570: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
e580: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e590: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
e5a0: 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
e5b0: 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
e5c0: 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
e5d0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e5e0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
e5f0: 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e  ATION.  const in
e600: 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
e610: 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
e620: 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
e630: 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
e640: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  sed */.  const B
e650: 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d  itmask maskSrc =
e660: 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d   getMask(pWC->pM
e670: 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20  askSet, iCur);  
e680: 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70  /* Bitmask for p
e690: 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  Src */.  WhereTe
e6a0: 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e  rm * const pWCEn
e6b0: 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d  d = &pWC->a[pWC-
e6c0: 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20  >nTerm];        
e6d0: 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61  /* End of pWC->a
e6e0: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
e6f0: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
e700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
e710: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68  ingle term of th
e720: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
e730: 2f 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74  /..  /* Search t
e740: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e750: 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62  terms for a usab
e760: 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a  le WO_OR term. *
e770: 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
e780: 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
e790: 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
e7a0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
e7b0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20  erator==WO_OR . 
e7c0: 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e      && ((pTerm->
e7d0: 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73  prereqAll & ~mas
e7e0: 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79  kSrc) & notReady
e7f0: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
e800: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
e810: 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b  indexable & mask
e820: 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  Src)!=0 .    ){.
e830: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
e840: 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
e850: 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
e860: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
e870: 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
e880: 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
e890: 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
e8a0: 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
e8b0: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
e8c0: 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
e8d0: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
e8e0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54  .      double rT
e8f0: 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
e900: 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b  double nRow = 0;
e910: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75  .      Bitmask u
e920: 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  sed = 0;..      
e930: 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
e940: 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
e950: 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
e960: 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72  +){.        Wher
e970: 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b  eCost sTermCost;
e980: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
e990: 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d  ACE(("... Multi-
e9a0: 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67  index OR testing
e9b0: 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20   for term %d of 
e9c0: 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20  %d....\n", .    
e9d0: 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d        (pOrTerm -
e9e0: 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65   pOrWC->a), (pTe
e9f0: 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20  rm - pWC->a).   
ea00: 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20       ));.       
ea10: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
ea20: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20  perator==WO_AND 
ea30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
ea40: 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43  reClause *pAndWC
ea50: 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70   = &pOrTerm->u.p
ea60: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
ea70: 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65 78         bestIndex
ea80: 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c  (pParse, pAndWC,
ea90: 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
eaa0: 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
eab0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eac0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
ead0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
eae0: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
eaf0: 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
eb00: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
eb10: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
eb20: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
eb30: 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
eb40: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
eb50: 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
eb60: 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
eb70: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
eb80: 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
eb90: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
eba0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
ebb0: 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
ebc0: 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72  se, &tempWC, pSr
ebd0: 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20  c, notReady, 0, 
ebe0: 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20  &sTermCost);.   
ebf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ec00: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
ec10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec20: 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72    rTotal += sTer
ec30: 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20  mCost.rCost;.   
ec40: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65       nRow += sTe
ec50: 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20 20 20  rmCost.nRow;.   
ec60: 20 20 20 20 20 75 73 65 64 20 7c 3d 20 73 54 65       used |= sTe
ec70: 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20  rmCost.used;.   
ec80: 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e       if( rTotal>
ec90: 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20  =pCost->rCost ) 
eca0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
ecb0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
ecc0: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
ecd0: 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73   clause, increas
ece0: 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20  e the scan cost 
ecf0: 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20  to account .    
ed00: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73    ** for the cos
ed10: 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a  t of the sort. *
ed20: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  /.      if( pOrd
ed30: 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20  erBy!=0 ){.     
ed40: 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f     rTotal += nRo
ed50: 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a  w*estLog(nRow);.
ed60: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
ed70: 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
ed80: 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20 63 6f   increases OR co
ed90: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 72  st to %.9g\n", r
eda0: 54 6f 74 61 6c 29 29 3b 0a 20 20 20 20 20 20 7d  Total));.      }
edb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
edc0: 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69  e cost of scanni
edd0: 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52  ng using this OR
ede0: 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69   term for optimi
edf0: 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  zation is.      
ee00: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
ee10: 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74   current cost st
ee20: 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72  ored in pCost, r
ee30: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
ee40: 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  nts.      ** of 
ee50: 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  pCost. */.      
ee60: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
ee70: 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20   multi-index OR 
ee80: 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25  cost=%.9g nrow=%
ee90: 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20  .9g\n", rTotal, 
eea0: 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66  nRow));.      if
eeb0: 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e  ( rTotal<pCost->
eec0: 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rCost ){.       
eed0: 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
eee0: 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20  rTotal;.        
eef0: 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52  pCost->nRow = nR
ef00: 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ow;.        pCos
ef10: 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a  t->used = used;.
ef20: 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70          pCost->p
ef30: 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c  lan.wsFlags = fl
ef40: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ags;.        pCo
ef50: 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d  st->plan.u.pTerm
ef60: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
ef70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
ef80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ef90: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
efa0: 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  N */.}..#ifndef 
efb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
efc0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41  UALTABLE./*.** A
efd0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
efe0: 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  late an sqlite3_
eff0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f000: 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20  ture. It is the 
f010: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
f020: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
f030: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
f040: 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63  elease the struc
f050: 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69  ture.** by passi
f060: 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72  ng the pointer r
f070: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
f080: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69  function to sqli
f090: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
f0a0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
f0b0: 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61  dex_info *alloca
f0c0: 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50  teIndexInfo(.  P
f0d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
f0e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
f0f0: 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  C,.  struct SrcL
f100: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a  ist_item *pSrc,.
f110: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f120: 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  erBy.){.  int i,
f130: 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
f140: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
f150: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
f160: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
f170: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f180: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
f190: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
f1a0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
f1b0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
f1c0: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
f1d0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
f1e0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
f1f0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
f200: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
f210: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
f220: 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65  Recomputing inde
f230: 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e  x info for %s...
f240: 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d  \n", pSrc->pTab-
f250: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
f260: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
f270: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
f280: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
f290: 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
f2a0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
f2b0: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
f2c0: 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70  for(i=nTerm=0, p
f2d0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
f2e0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
f2f0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
f300: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
f310: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
f320: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
f330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
f340: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28  erm->eOperator&(
f350: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f360: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  -1))==0 );.    t
f370: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
f380: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
f390: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f3a0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f3b0: 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
f3c0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f3d0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
f3e0: 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  IN|WO_ISNULL) ) 
f3f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
f400: 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
f410: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
f420: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
f430: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
f440: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
f450: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f460: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
f470: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
f480: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
f490: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
f4a0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f4b0: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
f4c0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
f4d0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f4e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
f4f0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
f500: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
f510: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
f520: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
f530: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
f540: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
f550: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
f560: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
f570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
f580: 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e  ( i==pOrderBy->n
f590: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Expr ){.      nO
f5a0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
f5b0: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d 0a  y->nExpr;.    }.
f5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
f5d0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
f5e0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f5f0: 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ure.  */.  pIdxI
f600: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
f610: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
f620: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
f630: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
f660: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
f670: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
f680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f690: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
f6a0: 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42  zeof(*pIdxOrderB
f6b0: 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20  y)*nOrderBy );. 
f6c0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
f6d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f6e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f6f0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
f700: 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65  ;.    /* (double
f710: 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
f720: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
f730: 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
f740: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f750: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
f760: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
f770: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
f780: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
f790: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
f7a0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
f7b0: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
f7c0: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
f7d0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
f7e0: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
f7f0: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
f800: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
f810: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
f820: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
f830: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
f840: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
f850: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
f860: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
f870: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
f880: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
f890: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
f8a0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
f8b0: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
f8c0: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
f8d0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
f8e0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
f8f0: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
f900: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
f910: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
f920: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
f930: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
f940: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
f950: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
f960: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
f970: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f980: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
f990: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
f9a0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
f9b0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f9c0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
f9d0: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
f9e0: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
f9f0: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
fa00: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fa10: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
fa20: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fa30: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
fa80: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
fa90: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
faa0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
fab0: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
fac0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
fad0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
fae0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
faf0: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
fb00: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
fb10: 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
fb20: 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
fb30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
fb40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
fb50: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
fb60: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
fb70: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
fb80: 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
fb90: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
fba0: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
fbb0: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
fbc0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
fbd0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
fbe0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
fbf0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
fc00: 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
fc10: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
fc20: 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65  p = (u8)pTerm->e
fc30: 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f 2a  Operator;.    /*
fc40: 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
fc50: 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
fc60: 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
fc70: 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
fc80: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
fc90: 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  WO_ and SQLITE_I
fca0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
fcb0: 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74   codes are ident
fcc0: 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a  ical.  The.    *
fcd0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
fce0: 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
fcf0: 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  fact. */.    ass
fd00: 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49  ert( WO_EQ==SQLI
fd10: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
fd20: 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  INT_EQ );.    as
fd30: 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
fd40: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
fd50: 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61  AINT_LT );.    a
fd60: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
fd70: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
fd80: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
fd90: 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53  assert( WO_GT==S
fda0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
fdb0: 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20  TRAINT_GT );.   
fdc0: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
fdd0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
fde0: 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
fdf0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41 54    assert( WO_MAT
fe00: 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  CH==SQLITE_INDEX
fe10: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
fe20: 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  H );.    assert(
fe30: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
fe40: 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54  r & (WO_EQ|WO_LT
fe50: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
fe60: 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a  GE|WO_MATCH) );.
fe70: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66      j++;.  }.  f
fe80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
fe90: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  By; i++){.    Ex
fea0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
feb0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
fec0: 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42  ;.    pIdxOrderB
fed0: 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  y[i].iColumn = p
fee0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
fef0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
ff00: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
ff10: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
ff20: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
ff30: 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a   pIdxInfo;.}../*
ff40: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62  .** The table ob
ff50: 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70  ject reference p
ff60: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ff70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
ff80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
ff90: 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20   must represent 
ffa0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ffb0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
ffc0: 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74  nvokes the xBest
ffd0: 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f  Index().** metho
ffe0: 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  d of the virtual
fff0: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
10000 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
10010 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  fo pointer passe
10020 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67 75  d.** as the argu
10030 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
10040 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10050 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
10060 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
10070 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
10080 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
10090 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
100a0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
100b0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
100c0 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
100d0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
100e0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
100f0 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
10100 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
10110 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
10120 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
10130 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
10140 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
10150 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
10160 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
10170 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
10180 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
10190 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
101a0 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
101b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
101c0 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
101d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
101e0 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
101f0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
10200 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
10210 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
10220 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
10230 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
10240 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vtab;.  int i;. 
10250 20 69 6e 74 20 72 63 3b 0a 0a 20 20 28 76 6f 69   int rc;..  (voi
10260 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
10270 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ff(pParse->db);.
10280 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78    WHERETRACE(("x
10290 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73  BestIndex for %s
102a0 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  \n", pTab->zName
102b0 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  ));.  TRACE_IDX_
102c0 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
102d0 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
102e0 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
102f0 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
10300 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
10310 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
10320 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e  afetyOn(pParse->
10330 64 62 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  db);..  if( rc!=
10340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10360 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70  NOMEM ){.      p
10370 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
10380 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
10390 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74 61   }else if( !pVta
103a0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
103b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
103c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
103d0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
103e0 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
103f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10400 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10410 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  %s", pVtab->zErr
10420 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Msg);.    }.  }.
10430 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10440 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 74 61  pParse->db, pVta
10450 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
10460 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
10470 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
10480 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
10490 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
104a0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
104b0 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
104c0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
104d0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
104e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
104f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10500 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
10510 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
10520 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
10530 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
10540 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
10550 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
10560 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a  arse->nErr;.}...
10570 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
10580 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
10590 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
105a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
105b0 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
105c0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
105d0 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
105e0 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
105f0 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
10600 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
10610 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
10620 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
10630 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
10640 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10650 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
10660 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
10670 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
10680 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
10690 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
106a0 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
106b0 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
106c0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
106d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
106e0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
106f0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10700 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
10710 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
10720 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
10730 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
10740 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
10750 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
10760 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
10770 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10780 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
10790 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
107a0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
107b0 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
107c0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
107d0 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
107e0 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
107f0 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
10800 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
10810 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
10820 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
10830 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
10840 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
10850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
10860 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
10870 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
108a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
108b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108d0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
108e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
108f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
10900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
10910 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
10920 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
10930 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10950 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
10960 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
10970 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  ilable */.  Expr
10980 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
10990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
109a0 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
109b0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  se */.  WhereCos
109c0 74 20 2a 70 43 6f 73 74 2c 20 20 20 20 20 20 20  t *pCost,       
109d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73          /* Lowes
109e0 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61  t cost query pla
109f0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
10a00 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64  ndex_info **ppId
10a10 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78 20  xInfo  /* Index 
10a20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
10a30 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
10a40 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
10a50 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
10a60 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
10a70 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
10a80 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
10a90 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
10aa0 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
10ab0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
10ac0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
10ad0 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
10ae0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
10af0 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
10b00 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
10b10 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
10b20 20 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69 74   wsFlags is init
10b30 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65 20  ialized to some 
10b40 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68 65  sane value. Othe
10b50 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a 20  rwise, if the . 
10b60 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c   ** malloc in al
10b70 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
10b80 29 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73  ) fails and this
10b90 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10ba0 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20 77  s leaving.  ** w
10bb0 73 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e 69  sFlags in an uni
10bc0 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
10bd0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
10be0 20 62 65 68 61 76 65 20 75 6e 70 72 65 64 69 63   behave unpredic
10bf0 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65  tably..  */.  me
10c00 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20 73  mset(pCost, 0, s
10c10 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a  izeof(*pCost));.
10c20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
10c30 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  Flags = WHERE_VI
10c40 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f  RTUALTABLE;..  /
10c50 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
10c60 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
10c70 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65  cture has not be
10c80 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  en previously.  
10c90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
10ca0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68   initialized, th
10cb0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  en allocate and 
10cc0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
10cd0 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  w..  */.  pIdxIn
10ce0 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  fo = *ppIdxInfo;
10cf0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
10d00 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 49 64 78  =0 ){.    *ppIdx
10d10 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 20  Info = pIdxInfo 
10d20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  = allocateIndexI
10d30 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c  nfo(pParse, pWC,
10d40 20 70 53 72 63 2c 20 70 4f 72 64 65 72 42 79 29   pSrc, pOrderBy)
10d50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
10d60 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Info==0 ){.    r
10d70 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
10d80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
10d90 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
10da0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
10db0 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20 70   that pIdxInfo p
10dc0 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77 69  oints.  ** to wi
10dd0 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  ll have been ini
10de0 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65 72  tialized, either
10df0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
10e00 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ent invocation o
10e10 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73 6f  r.  ** during so
10e20 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74  me prior invocat
10e30 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75 73  ion.  Now we jus
10e40 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f 6d  t have to custom
10e50 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65 74  ize the.  ** det
10e60 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66 6f  ails of pIdxInfo
10e70 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
10e80 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
10e90 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a 20  pass it to.  ** 
10ea0 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a 2f  xBestIndex..  */
10eb0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75 6c  ..  /* The modul
10ec0 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 64  e name must be d
10ed0 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62 79  efined. Also, by
10ee0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
10ef0 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  e must.  ** be a
10f00 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
10f10 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
10f20 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
10f30 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69 65  .  ** sqlite3Vie
10f40 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
10f50 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69 63  ) would have pic
10f60 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f 72  ked up the error
10f70 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
10f80 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  ( pTab->azModule
10f90 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d  Arg && pTab->azM
10fa0 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20  oduleArg[0] );. 
10fb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10fc0 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65  GetVTable(pParse
10fd0 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a 0a  ->db, pTab) );..
10fe0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
10ff0 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
11000 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
11010 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
11020 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
11030 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
11040 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
11050 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
11060 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
11070 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
11080 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
11090 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
110a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
110b0 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
110c0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
110d0 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
110e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
110f0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
11100 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
11110 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
11120 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
11130 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
11140 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
11150 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
11160 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
11170 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
11180 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
11190 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
111a0 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
111b0 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
111c0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
111d0 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
111e0 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
111f0 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
11200 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
11210 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
11220 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
11230 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
11240 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
11250 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
11260 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
11270 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
11280 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
11290 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
112a0 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
112b0 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
112c0 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
112d0 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
112e0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
112f0 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
11300 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
11310 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
11320 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
11330 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
11340 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
11350 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
11360 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
11370 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
11380 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
11390 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
113a0 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
113b0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
113c0 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
113d0 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
113e0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
113f0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
11400 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
11410 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
11420 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
11430 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
11440 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
11450 3e 70 72 65 72 65 71 52 69 67 68 74 26 6e 6f 74  >prereqRight&not
11460 52 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b 0a  Ready) ? 0 : 1;.
11470 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73    }.  memset(pUs
11480 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
11490 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
114a0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
114b0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
114c0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
114d0 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
114e0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
114f0 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20  >idxStr);.  }.  
11500 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
11510 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
11520 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
11530 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
11540 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
11550 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
11560 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
11570 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29 32  .  /* ((double)2
11580 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c  ) In case of SQL
11590 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
115a0 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20  G_POINT... */.  
115b0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
115c0 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
115d0 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f 75  _BIG_DBL / ((dou
115e0 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65 72  ble)2);.  nOrder
115f0 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  By = pIdxInfo->n
11600 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21  OrderBy;.  if( !
11610 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11620 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
11630 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  By = 0;.  }..  i
11640 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  f( vtabBestIndex
11650 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
11660 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  IdxInfo) ){.    
11670 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
11680 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
11690 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
116a0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
116b0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
116c0 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
116d0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
116e0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
116f0 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69      if( pUsage[i
11700 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
11710 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73  .      pCost->us
11720 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49 64  ed |= pWC->a[pId
11730 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f 66  xCons[i].iTermOf
11740 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
11750 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
11760 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
11770 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
11780 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
11790 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
117a0 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c  .  ** inital val
117b0 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
117c0 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
117d0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
117e0 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f 77  e.  ** (cost<low
117f0 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
11800 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
11810 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20 20  e true..  ** .  
11820 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65 29  ** Use "(double)
11830 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 32  2" instead of "2
11840 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49 54  .0" in case OMIT
11850 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20  _FLOATING_POINT 
11860 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  .  ** is defined
11870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53 51  ..  */.  if( (SQ
11880 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64  LITE_BIG_DBL/((d
11890 6f 75 62 6c 65 29 32 29 29 3c 70 49 64 78 49 6e  ouble)2))<pIdxIn
118a0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
118b0 74 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  t ){.    pCost->
118c0 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f  rCost = (SQLITE_
118d0 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
118e0 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )2));.  }else{. 
118f0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
11900 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  = pIdxInfo->esti
11910 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 7d 0a 20  matedCost;.  }. 
11920 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
11930 56 74 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e  VtabIdx = pIdxIn
11940 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  fo;.  if( pIdxIn
11950 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
11960 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73 74  med ){.    pCost
11970 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c  ->plan.wsFlags |
11980 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  = WHERE_ORDERBY;
11990 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  .  }.  pCost->pl
119a0 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49  an.nEq = 0;.  pI
119b0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
119c0 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = nOrderBy;..  
119d0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
119e0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
119f0 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20 62  access pattern b
11a00 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65  y using multiple
11a10 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f   indexes.  ** to
11a20 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20   optimize an OR 
11a30 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
11a40 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
11a50 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74  se. .  */.  best
11a60 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50  OrClauseIndex(pP
11a70 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
11a80 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65   notReady, pOrde
11a90 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23  rBy, pCost);.}.#
11aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11ab0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11ac0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  E */../*.** Argu
11ad0 6d 65 6e 74 20 70 49 64 78 20 69 73 20 61 20 70  ment pIdx is a p
11ae0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 64  ointer to an ind
11af0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ex structure tha
11b00 74 20 68 61 73 20 61 6e 20 61 72 72 61 79 20 6f  t has an array o
11b10 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45  f.** SQLITE_INDE
11b20 58 5f 53 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79  X_SAMPLES evenly
11b30 20 73 70 61 63 65 64 20 73 61 6d 70 6c 65 73 20   spaced samples 
11b40 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 64  of the first ind
11b50 65 78 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73  exed column.** s
11b60 74 6f 72 65 64 20 69 6e 20 49 6e 64 65 78 2e 61  tored in Index.a
11b70 53 61 6d 70 6c 65 2e 20 54 68 65 20 64 6f 6d 61  Sample. The doma
11b80 69 6e 20 6f 66 20 76 61 6c 75 65 73 20 73 74 6f  in of values sto
11b90 72 65 64 20 69 6e 20 73 61 69 64 20 63 6f 6c 75  red in said colu
11ba0 6d 6e 0a 2a 2a 20 6d 61 79 20 62 65 20 74 68 6f  mn.** may be tho
11bb0 75 67 68 74 20 6f 66 20 61 73 20 64 69 76 69 64  ught of as divid
11bc0 65 64 20 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f  ed into (SQLITE_
11bd0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29  INDEX_SAMPLES+1)
11be0 20 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67   regions..** Reg
11bf0 69 6f 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20 61  ion 0 contains a
11c00 6c 6c 20 76 61 6c 75 65 73 20 73 6d 61 6c 6c 65  ll values smalle
11c10 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  r than the first
11c20 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52   sample value. R
11c30 65 67 69 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61  egion.** 1 conta
11c40 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65  ins values large
11c50 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
11c60 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
11c70 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
11c80 2c 0a 2a 2a 20 62 75 74 20 73 6d 61 6c 6c 65 72  ,.** but smaller
11c90 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
11ca0 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 41  of the second. A
11cb0 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
11cc0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
11cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
11ce0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 6f 66  ermines which of
11cf0 20 74 68 65 20 72 65 67 69 6f 6e 73 20 76 61 6c   the regions val
11d00 75 65 20 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73  ue .** pVal lies
11d10 20 69 6e 2c 20 73 65 74 73 20 2a 70 69 52 65 67   in, sets *piReg
11d20 69 6f 6e 20 74 6f 20 74 68 65 20 72 65 67 69 6f  ion to the regio
11d30 6e 20 69 6e 64 65 78 20 28 61 20 76 61 6c 75 65  n index (a value
11d40 20 62 65 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e   between 0.** an
11d50 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  d SQLITE_INDEX_S
11d60 41 4d 50 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73  AMPLES+1, inclus
11d70 69 76 65 29 20 61 6e 64 20 72 65 74 75 72 6e 73  ive) and returns
11d80 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
11d90 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  r, if an OOM occ
11da0 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76 65 72  urs while conver
11db0 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75 65 73  ting text values
11dc0 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e   between encodin
11dd0 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  gs,.** SQLITE_NO
11de0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
11df0 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20 69 73  and *piRegion is
11e00 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23   undefined..*/.#
11e10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11e20 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63  BLE_STAT2.static
11e30 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 52   int whereRangeR
11e40 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  egion(.  Parse *
11e50 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11e60 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11e70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11e80 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ea0 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
11eb0 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
11ec0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
11ed0 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
11ee0 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
11ef0 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65  r */.  int *piRe
11f00 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  gion            
11f10 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f     /* OUT: Regio
11f20 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77  n of domain in w
11f30 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73 20  hich value lies 
11f40 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  */.){.  if( ALWA
11f50 59 53 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20  YS(pVal) ){.    
11f60 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61  IndexSample *aSa
11f70 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61  mple = pIdx->aSa
11f80 6d 70 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69 20  mple;.    int i 
11f90 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 65 54 79  = 0;.    int eTy
11fa0 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
11fb0 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
11fc0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
11fd0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c  QLITE_INTEGER ||
11fe0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
11ff0 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 64 6f  LOAT ){.      do
12000 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
12010 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56  _value_double(pV
12020 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  al);.      for(i
12030 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44  =0; i<SQLITE_IND
12040 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29  EX_SAMPLES; i++)
12050 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
12060 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
12070 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f  SQLITE_NULL ) co
12080 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12090 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
120a0 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
120b0 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
120c0 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a 20  u.r>r ) break;. 
120d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
120e0 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  { .      sqlite3
120f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12100 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  b;.      CollSeq
12110 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63   *pColl;.      c
12120 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20  onst u8 *z;.    
12130 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20    int n;..      
12140 2f 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66 72  /* pVal comes fr
12150 6f 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  om sqlite3ValueF
12160 72 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68 65  romExpr() so the
12170 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20   type cannot be 
12180 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73  NULL */.      as
12190 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
121a0 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70  ITE_TEXT || eTyp
121b0 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
121c0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ;..      if( eTy
121d0 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
121e0 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28  ){.        z = (
121f0 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74  const u8 *)sqlit
12200 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56  e3_value_blob(pV
12210 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  al);.        pCo
12220 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
12230 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ll;.        asse
12240 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d  rt( pColl->enc==
12250 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20  SQLITE_UTF8 );. 
12260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12270 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
12280 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
12290 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
122a0 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29  , *pIdx->azColl)
122b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
122c0 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
122d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
122e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
122f0 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
12300 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20  equence: %s",.  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e 61          *pIdx->a
12330 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zColl);.        
12340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12350 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
12360 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f  .        z = (co
12370 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33  nst u8 *)sqlite3
12380 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
12390 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
123a0 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a 20       if( !z ){. 
123b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
123c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
123d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
123e0 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43 6f  assert( z && pCo
123f0 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
12400 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p );.      }.   
12410 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56 61     n = sqlite3Va
12420 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20 70  lueBytes(pVal, p
12430 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20  Coll->enc);..   
12440 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
12450 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
12460 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ES; i++){.      
12470 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
12480 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65   int eSampletype
12490 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54   = aSample[i].eT
124a0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
124b0 20 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51   eSampletype==SQ
124c0 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61  LITE_NULL || eSa
124d0 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20 29  mpletype<eType )
124e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
124f0 20 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65 74     if( (eSamplet
12500 79 70 65 21 3d 65 54 79 70 65 29 20 29 20 62 72  ype!=eType) ) br
12510 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eak;.#ifndef SQL
12520 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
12530 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
12540 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
12550 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F8 ){.          
12560 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  int nSample;.   
12570 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61         char *zSa
12580 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74  mple = sqlite3Ut
12590 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20  f8to16(.        
125a0 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d        db, pColl-
125b0 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  >enc, aSample[i]
125c0 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  .u.z, aSample[i]
125d0 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65  .nByte, &nSample
125e0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
125f0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61          if( !zSa
12600 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  mple ){.        
12610 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12630 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12640 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12650 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12660 20 20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c         r = pColl
12670 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
12680 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53  ser, nSample, zS
12690 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20  ample, n, z);.  
126a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
126b0 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c  bFree(db, zSampl
126c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
126d0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
126e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 20 3d   {.          r =
126f0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
12700 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d 70  ll->pUser, aSamp
12710 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61  le[i].nByte, aSa
12720 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20  mple[i].u.z, n, 
12730 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
12740 20 20 20 20 20 20 69 66 28 20 72 3e 30 20 29 20        if( r>0 ) 
12750 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12760 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
12770 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c  ( i>=0 && i<=SQL
12780 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
12790 53 20 29 3b 0a 20 20 20 20 2a 70 69 52 65 67 69  S );.    *piRegi
127a0 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  on = i;.  }.  re
127b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
127c0 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23 69  }.#endif   /* #i
127d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
127e0 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT2 */../*.
127f0 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
12800 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
12810 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
12820 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
12830 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
12840 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
12850 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
12860 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
12870 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
12880 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
12890 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
128a0 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
128b0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
128c0 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
128d0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
128e0 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
128f0 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
12900 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
12910 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
12920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
12930 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
12940 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
12950 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
12960 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
12970 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
12980 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
12990 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
129a0 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
129b0 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
129c0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
129d0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
129e0 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
129f0 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
12a00 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
12a10 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
12a20 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
12a30 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
12a40 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
12a50 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
12a60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
12a70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
12a80 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
12a90 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
12aa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12ab0 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69  E_STAT2.static i
12ac0 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
12ad0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12ae0 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
12af0 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
12b00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12b10 2a 70 70 0a 29 7b 0a 20 20 2f 2a 20 54 68 65 20  *pp.){.  /* The 
12b20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 29 20  evalConstExpr() 
12b30 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 68 61  function will ha
12b40 76 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 76 65  ve already conve
12b50 72 74 65 64 20 61 6e 79 20 54 4b 5f 56 41 52 49  rted any TK_VARI
12b60 41 42 4c 45 0a 20 20 2a 2a 20 65 78 70 72 65 73  ABLE.  ** expres
12b70 73 69 6f 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e  sion involved in
12b80 20 61 6e 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   an comparison i
12b90 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45  nto a TK_REGISTE
12ba0 52 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  R. */.  assert( 
12bb0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 56 41  pExpr->op!=TK_VA
12bc0 52 49 41 42 4c 45 20 29 3b 0a 20 20 69 66 28 20  RIABLE );.  if( 
12bd0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
12be0 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
12bf0 3e 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  >op2==TK_VARIABL
12c00 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61  E ){.    int iVa
12c10 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  r = pExpr->iColu
12c20 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
12c30 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
12c40 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
12c50 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  r);.    *pp = sq
12c60 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75  lite3VdbeGetValu
12c70 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  e(pParse->pRepre
12c80 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66 29  pare, iVar, aff)
12c90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12ca0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
12cb0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c 75  turn sqlite3Valu
12cc0 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65  eFromExpr(pParse
12cd0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c  ->db, pExpr, SQL
12ce0 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20 70  ITE_UTF8, aff, p
12cf0 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  p);.}.#endif../*
12d00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12d10 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74  n is used to est
12d20 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
12d30 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
12d40 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a  ll be visited.**
12d50 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20   by scanning an 
12d60 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67  index for a rang
12d70 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65  e of values. The
12d80 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20   range may have 
12d90 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e  an upper.** boun
12da0 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64  d, a lower bound
12db0 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57  , or both. The W
12dc0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12dd0 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75  s that set the u
12de0 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65  pper.** and lowe
12df0 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70  r bounds are rep
12e00 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77  resented by pLow
12e10 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65  er and pUpper re
12e20 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a  spectively. For.
12e30 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  ** example, assu
12e40 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20  ming that index 
12e50 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a  p is on t1(a):.*
12e60 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
12e70 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
12e80 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20  ND a < ? ....** 
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f     |_____|   |__
12eb0 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___|.**         
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
12ed0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65   pLower    pUppe
12f00 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  r.**.** If eithe
12f10 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f  r of the upper o
12f20 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73  r lower bound is
12f30 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68   not present, th
12f40 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65  en NULL is passe
12f50 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66  d in.** place of
12f60 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
12f70 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a  ng WhereTerm..**
12f80 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61  .** The nEq para
12f90 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
12fa0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
12fb0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75   index column su
12fc0 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20  bject to the.** 
12fd0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
12fe0 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
12ff0 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
13000 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
13010 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69  raints.** optimi
13020 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
13030 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
13040 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
13050 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73  uming index p is
13060 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c  .** on t1(a, b),
13070 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
13080 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
13090 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
130a0 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
130b0 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
130c0 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68  *.** then nEq sh
130d0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
130e0 68 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74  he value 1 (as t
130f0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
13100 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62  ted column,.** b
13110 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  , is the second 
13120 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
13130 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
13140 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
13150 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
13160 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
13170 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
13180 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
13190 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
131a0 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ed 0..**.** The 
131b0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
131c0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74  s an integer bet
131d0 77 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20  ween 1 and 100, 
131e0 69 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74  inclusive. A ret
131f0 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
13200 31 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  1 indicates that
13210 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61   the proposed ra
13220 6e 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65  nge scan is expe
13230 63 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a  cted to visit.**
13240 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31   approximately 1
13250 2f 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74  /100th (1%) of t
13260 68 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64  he rows selected
13270 20 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61   by the nEq equa
13280 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
13290 6e 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20  nts (if any). A 
132a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
132b0 31 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68  100 indicates th
132c0 61 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65  at it is expecte
132d0 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61  d.** that the ra
132e0 6e 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  nge scan will vi
132f0 73 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31  sit every row (1
13300 30 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79  00%) selected by
13310 20 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a   the equality.**
13320 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
13330 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
13340 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
13350 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t2 ANALYZE data,
13360 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71   each range ineq
13370 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65  uality.** reduce
13380 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
13390 63 65 20 62 79 20 32 2f 33 72 64 73 2e 20 20 48  ce by 2/3rds.  H
133a0 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  ence a single co
133b0 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a  nstraint (x>?).*
133c0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72  * results in a r
133d0 65 74 75 72 6e 20 6f 66 20 33 33 20 61 6e 64 20  eturn of 33 and 
133e0 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  a range constrai
133f0 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  nt (x>? AND x<?)
13400 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61   results.** in a
13410 20 72 65 74 75 72 6e 20 6f 66 20 31 31 2e 0a 2a   return of 11..*
13420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13430 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
13440 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13450 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13460 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
13470 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13480 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
13490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
134a0 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ex containing th
134b0 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
134c0 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a   column; "x" */.
134d0 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
134e0 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20         /* index 
134f0 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f  into p->aCol[] o
13500 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  f the range-comp
13510 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ared column */. 
13520 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
13530 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
13540 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
13550 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
13560 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
13570 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
13580 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
13590 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
135a0 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
135b0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
135c0 0a 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20  .  int *piEst   
135d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
135e0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
135f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13600 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
13610 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13620 54 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT2..  if( nEq=
13630 3d 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65  =0 && p->aSample
13640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13650 76 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c  value *pLowerVal
13660 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
13670 33 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56  3_value *pUpperV
13680 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  al = 0;.    int 
13690 69 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iEst;.    int iL
136a0 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ower = 0;.    in
136b0 74 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49 54  t iUpper = SQLIT
136c0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
136d0 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d  .    u8 aff = p-
136e0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
136f0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
13700 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28  finity;..    if(
13710 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20   pLower ){.     
13720 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13730 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
13740 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ight;.      rc =
13750 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
13760 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
13770 66 2c 20 26 70 4c 6f 77 65 72 56 61 6c 29 3b 0a  f, &pLowerVal);.
13780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
137a0 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 45  Upper ){.      E
137b0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
137c0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
137d0 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76  ht;.      rc = v
137e0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
137f0 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
13800 20 26 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20   &pUpperVal);.  
13810 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
13820 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
13830 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20 70  LowerVal==0 && p
13840 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a  UpperVal==0) ){.
13850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
13860 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c  ueFree(pLowerVal
13870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13880 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72  ValueFree(pUpper
13890 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  Val);.      goto
138a0 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62   range_est_fallb
138b0 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ack;.    }else i
138c0 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20  f( pLowerVal==0 
138d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
138e0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
138f0 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72  Parse, p, pUpper
13900 56 61 6c 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  Val, &iUpper);. 
13910 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
13920 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70 65  ) iLower = iUppe
13930 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  r/2;.    }else i
13940 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 20  f( pUpperVal==0 
13950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
13960 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
13970 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
13980 56 61 6c 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20  Val, &iLower);. 
13990 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
139a0 29 20 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77  ) iUpper = (iLow
139b0 65 72 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45  er + SQLITE_INDE
139c0 58 5f 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32  X_SAMPLES + 1)/2
139d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
139e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
139f0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
13a00 20 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 26   p, pUpperVal, &
13a10 69 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69  iUpper);.      i
13a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13a30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13a40 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
13a50 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f  n(pParse, p, pLo
13a60 77 65 72 56 61 6c 2c 20 26 69 4c 6f 77 65 72 29  werVal, &iLower)
13a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13a80 0a 20 20 20 20 69 45 73 74 20 3d 20 69 55 70 70  .    iEst = iUpp
13a90 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
13aa0 20 74 65 73 74 63 61 73 65 28 20 69 45 73 74 3d   testcase( iEst=
13ab0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  =SQLITE_INDEX_SA
13ac0 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 61 73 73  MPLES );.    ass
13ad0 65 72 74 28 20 69 45 73 74 3c 3d 53 51 4c 49 54  ert( iEst<=SQLIT
13ae0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
13af0 29 3b 0a 20 20 20 20 69 66 28 20 69 45 73 74 3c  );.    if( iEst<
13b00 31 20 29 7b 0a 20 20 20 20 20 20 69 45 73 74 20  1 ){.      iEst 
13b10 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
13b20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13b30 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20  (pLowerVal);.   
13b40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
13b50 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20  e(pUpperVal);.  
13b60 20 20 2a 70 69 45 73 74 20 3d 20 28 69 45 73 74    *piEst = (iEst
13b70 20 2a 20 31 30 30 29 2f 53 51 4c 49 54 45 5f 49   * 100)/SQLITE_I
13b80 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20  NDEX_SAMPLES;.  
13b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13ba0 0a 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62  .range_est_fallb
13bb0 61 63 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ack:.#else.  UNU
13bc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
13bd0 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  arse);.  UNUSED_
13be0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
13bf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13c00 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (nEq);.#endif.  
13c10 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
13c20 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 69 66  | pUpper );.  if
13c30 28 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70  ( pLower && pUpp
13c40 65 72 20 29 7b 0a 20 20 20 20 2a 70 69 45 73 74  er ){.    *piEst
13c50 20 3d 20 31 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = 11;.  }else{.
13c60 20 20 20 20 2a 70 69 45 73 74 20 3d 20 33 33 3b      *piEst = 33;
13c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13c80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ;.}.../*.** Find
13c90 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
13ca0 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
13cb0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
13cc0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
13cd0 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  best query plan 
13ce0 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74  and its cost int
13cf0 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20  o the WhereCost 
13d00 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20  object supplied 
13d10 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  as the.** last p
13d20 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
13d30 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
13d40 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20  plan wins.  The 
13d50 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d  cost is an estim
13d60 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e  ate of the amoun
13d70 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20  t of.** CPU and 
13d80 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f  disk I/O need to
13d90 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71   process the req
13da0 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20 73  uest using the s
13db0 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a  elected plan..**
13dc0 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e   Factors that in
13dd0 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63  fluence cost inc
13de0 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  lude:.**.**    *
13df0 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20    The estimated 
13e00 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
13e10 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72  hat will be retr
13e20 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20  ieved.  (The.** 
13e30 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20        fewer the 
13e40 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  better.).**.**  
13e50 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
13e60 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74  not sorting must
13e70 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   occur..**.**   
13e80 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
13e90 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  ot there must be
13ea0 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70   separate lookup
13eb0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  s in the.**     
13ec0 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74    index and in t
13ed0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
13ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61  *.** If there wa
13ef0 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
13f00 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49  clause (pSrc->pI
13f10 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74  ndex) attached t
13f20 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a  o the table in.*
13f30 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
13f40 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
13f50 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
13f60 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
13f70 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
13f80 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75   index. If no su
13f90 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64  ch plan is found
13fa0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
13fb0 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53  ned cost is.** S
13fc0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49  QLITE_BIG_DBL. I
13fd0 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  f a plan is foun
13fe0 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  d that uses the 
13ff0 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a  named index, .**
14000 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
14010 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20  s calculated in 
14020 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a  the usual way..*
14030 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e  *.** If a NOT IN
14040 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70 53  DEXED clause (pS
14050 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d  rc->notIndexed!=
14060 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64 20  0) was attached 
14070 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  to the table .**
14080 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
14090 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e  tatement, then n
140a0 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f  o indexes are co
140b0 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65  nsidered. Howeve
140c0 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63  r, the .** selec
140d0 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69  ted plan may sti
140e0 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  ll take advantag
140f0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
14100 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a 2a  built-in rowid.*
14110 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  * index..*/.stat
14120 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72 65  ic void bestBtre
14130 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
14140 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
14160 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14170 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
14180 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
14190 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
141a0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
141b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
141c0 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
141d0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
141e0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
141f0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
14200 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
14210 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
14220 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
14230 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14240 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
14250 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
14260 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
14270 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
14280 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
14290 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
142a0 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  an */.){.  int i
142b0 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
142c0 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
142d0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
142e0 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
142f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
14300 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
14310 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
14320 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
14330 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
14340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14350 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f   /* Copy of pPro
14360 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20  be, or zero for 
14370 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  IPK index */.  i
14380 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20  nt eqTermMask;  
14390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
143a0 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61  rrent mask of va
143b0 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
143c0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
143d0 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20  idxEqTermMask;  
143e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
143f0 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
14400 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
14410 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  s */.  Index sPk
14420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14430 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
14440 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
14450 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
14460 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
14470 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 2f  aiRowEstPk[2]; /
14480 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
14490 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
144a0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
144b0 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  t aiColumnPk = -
144c0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
144d0 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
144e0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
144f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c  ex */.  int wsFl
14500 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  agMask;         
14510 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66      /* Allowed f
14520 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e 70  lags in pCost->p
14530 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20  lan.wsFlag */.. 
14540 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
14550 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
14560 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
14570 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c  .  memset(pCost,
14580 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73   0, sizeof(*pCos
14590 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72 43  t));.  pCost->rC
145a0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
145b0 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  _DBL;..  /* If t
145c0 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73  he pSrc table is
145d0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
145e0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
145f0 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a  then we may not.
14600 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65    ** use an inde
14610 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20  x to satisfy IS 
14620 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
14630 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   on that table. 
14640 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65   This is.  ** be
14650 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69  cause columns mi
14660 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
14670 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62   NULL if the tab
14680 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  le does not matc
14690 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75  h -.  ** a circu
146a0 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68  mstance which th
146b0 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  e index cannot h
146c0 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e  elp us discover.
146d0 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a    Ticket #2177..
146e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d    */.  if( pSrc-
146f0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
14700 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71  EFT ){.    idxEq
14710 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
14720 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_IN;.  }else{
14730 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61  .    idxEqTermMa
14740 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
14750 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a  |WO_ISNULL;.  }.
14760 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
14770 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
14780 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
14790 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
147a0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
147b0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49  to use */.    pI
147c0 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53  dx = pProbe = pS
147d0 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  rc->pIndex;.    
147e0 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
147f0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
14800 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
14810 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
14820 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
14830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
14840 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
14850 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
14860 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
14870 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 0a  Index object to.
14880 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
14890 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
148a0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
148b0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
148c0 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
148d0 65 72 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  er index on the 
148e0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
148f0 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
14900 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
14910 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
14920 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
14930 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
14940 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
14950 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
14960 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
14970 31 5d 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  1] = 1;.    sPk.
14980 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
14990 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
149a0 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
149b0 62 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  b;.    pFirst = 
149c0 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
149d0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
149e0 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
149f0 29 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  ){.      sPk.pNe
14a00 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
14a10 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 69   }.    /* The ai
14a20 52 6f 77 45 73 74 50 6b 5b 30 5d 20 69 73 20 61  RowEstPk[0] is a
14a30 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
14a40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
14a50 66 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  f rows in the.  
14a60 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 47 65 74    ** table.  Get
14a70 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
14a80 6e 20 66 72 6f 6d 20 74 68 65 20 41 4e 41 4c 59  n from the ANALY
14a90 5a 45 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ZE information i
14aa0 66 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 61  f it is.    ** a
14ab0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 6e 6f  vailable.  If no
14ac0 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 73 73  t available, ass
14ad0 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 31 20  ume the table 1 
14ae0 6d 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 69 6e 20  million rows in 
14af0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14b00 20 69 66 28 20 70 46 69 72 73 74 20 29 7b 0a 20   if( pFirst ){. 
14b10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69       assert( pFi
14b20 72 73 74 2d 3e 61 69 52 6f 77 45 73 74 21 3d 30  rst->aiRowEst!=0
14b30 20 29 3b 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64   ); /* Allocated
14b40 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 70   together with p
14b50 46 69 72 73 74 20 2a 2f 0a 20 20 20 20 20 20 61  First */.      a
14b60 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
14b70 46 69 72 73 74 2d 3e 61 69 52 6f 77 45 73 74 5b  First->aiRowEst[
14b80 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
14b90 20 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b       aiRowEstPk[
14ba0 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  0] = 1000000;.  
14bb0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
14bc0 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
14bd0 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
14be0 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
14bf0 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
14c00 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
14c10 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
14c20 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
14c30 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
14c40 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
14c50 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
14c60 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
14c70 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
14c80 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
14c90 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
14ca0 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
14cb0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
14cc0 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
14cd0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69  const unsigned i
14ce0 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77  nt * const aiRow
14cf0 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Est = pProbe->ai
14d00 52 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62  RowEst;.    doub
14d10 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
14d20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
14d30 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
14d40 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52  */.    double nR
14d50 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
14d60 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
14d70 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
14d80 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
14d90 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20      int rev;    
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
14dc0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
14dd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c   */.    int wsFl
14de0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  ags = 0;.    Bit
14df0 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
14e00 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
14e10 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61  wing variables a
14e20 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  re populated bas
14e30 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72  ed on the proper
14e40 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73  ties of.    ** s
14e50 63 61 6e 20 62 65 69 6e 67 20 65 76 61 6c 75 61  can being evalua
14e60 74 65 64 2e 20 54 68 65 79 20 61 72 65 20 74 68  ted. They are th
14e70 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  en used to deter
14e80 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63 74 65  mine the expecte
14e90 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e  d.    ** cost an
14ea0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
14eb0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a   returned..    *
14ec0 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a  *.    **  nEq: .
14ed0 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72      **    Number
14ee0 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65 72   of equality ter
14ef0 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 69  ms that can be i
14f00 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
14f10 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
14f20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75  **.    **  nInMu
14f30 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54  l:  .    **    T
14f40 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65  he "in-multiplie
14f50 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  r". This is an e
14f60 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d  stimate of how m
14f70 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69  any seek operati
14f80 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53  ons .    **    S
14f90 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
14fa0 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  rm on the index 
14fb0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72  in question. For
14fc0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
14fd0 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52   .    **    WHER
14fe0 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20  E clause is:.   
14ff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
15000 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32  WHERE a IN (1, 2
15010 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34  , 3) AND b IN (4
15020 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20  , 5, 6).    **. 
15030 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
15040 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c  must perform 9 l
15050 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64  ookups on an ind
15060 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f  ex on (a, b), so
15070 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20   nInMul is .    
15080 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20  **    set to 9. 
15090 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73  Given the same s
150a0 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72  chema and either
150b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
150c0 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20  g WHERE .    ** 
150d0 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20     clauses:.    
150e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
150f0 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20  HERE a =  1.    
15100 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
15110 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20  >= 2.    **.    
15120 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20  **    nInMul is 
15130 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a  set to 1..    **
15140 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68  .    **    If th
15150 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45  ere exists a WHE
15160 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  RE term of the f
15170 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43  orm "x IN (SELEC
15180 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20  T ...)", then . 
15190 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62     **    the sub
151a0 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d  -select is assum
151b0 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20  ed to return 25 
151c0 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72  rows for the pur
151d0 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a  poses of .    **
151e0 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20      determining 
151f0 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20  nInMul..    **. 
15200 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20     **  bInEst:  
15210 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74  .    **    Set t
15220 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20  o true if there 
15230 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  was at least one
15240 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
15250 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a  ..)" term used .
15260 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74      **    in det
15270 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ermining the val
15280 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20  ue of nInMul..  
15290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 42 6f    **.    **  nBo
152a0 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41  und:.    **    A
152b0 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68  n estimate on th
152c0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
152d0 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74 20  table that must 
152e0 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41 0a  be searched.  A.
152f0 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65 20      **    value 
15300 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68 65  of 100 means the
15310 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69 73   entire table is
15320 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e 67   searched.  Rang
15330 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
15340 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72 65    **    might re
15350 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20 76  duce this to a v
15360 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 31  alue less than 1
15370 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  00 to indicate t
15380 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  hat only.    ** 
15390 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f 66     a fraction of
153a0 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 73   the table needs
153b0 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e 20   searching.  In 
153c0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a 20  the absence of. 
153d0 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f     **    sqlite_
153e0 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61  stat2 ANALYZE da
153f0 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
15400 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
15410 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
15420 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
15430 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  3rd its original
15440 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e   size.  So an x>
15450 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  ? constraint red
15460 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20 6e  uces.    **    n
15470 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20 54 77  Bound to 33.  Tw
15480 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  o constraints (x
15490 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
154a0 63 65 20 6e 42 6f 75 6e 64 20 74 6f 20 31 31 2e  ce nBound to 11.
154b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
154c0 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a  bSort:   .    **
154d0 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75      Boolean. Tru
154e0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
154f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15500 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
15510 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20  re an .    **   
15520 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28   external sort (
15530 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68  i.e. scanning th
15540 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  e index being ev
15550 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74  aluated will not
15560 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72   .    **    corr
15570 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f  ectly order reco
15580 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rds)..    **.   
15590 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20   **  bLookup: . 
155a0 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
155b0 2e 20 54 72 75 65 20 69 66 20 66 6f 72 20 65 61  . True if for ea
155c0 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 20 76  ch index entry v
155d0 69 73 69 74 65 64 20 61 20 6c 6f 6f 6b 75 70 20  isited a lookup 
155e0 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  on the .    **  
155f0 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
15600 74 61 62 6c 65 20 62 2d 74 72 65 65 20 69 73 20  table b-tree is 
15610 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 69  required. This i
15620 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 0a  s always false .
15630 20 20 20 20 2a 2a 20 20 20 20 66 6f 72 20 74 68      **    for th
15640 65 20 72 6f 77 69 64 20 69 6e 64 65 78 2e 20 46  e rowid index. F
15650 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73  or other indexes
15660 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c  , it is true unl
15670 65 73 73 20 61 6c 6c 20 74 68 65 20 0a 20 20 20  ess all the .   
15680 20 2a 2a 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f   **    columns o
15690 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65 64  f the table used
156a0 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
156b0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65  tatement are pre
156c0 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  sent in .    ** 
156d0 20 20 20 74 68 65 20 69 6e 64 65 78 20 28 73 75     the index (su
156e0 63 68 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ch an index is s
156f0 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69 62  ometimes describ
15700 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ed as a covering
15710 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20   index)..    ** 
15720 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
15730 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20  given the index 
15740 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73  on (a, b), the s
15750 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c  econd of the fol
15760 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20  lowing .    **  
15770 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72 65    two queries re
15780 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74  quires table b-t
15790 72 65 65 20 6c 6f 6f 6b 75 70 73 2c 20 62 75 74  ree lookups, but
157a0 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73 20   the first does 
157b0 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  not..    **.    
157c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
157d0 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52  ELECT a, b    FR
157e0 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
157f0 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   1;.    **      
15800 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
15810 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
15820 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
15830 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 0a  */.    int nEq;.
15840 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d      int bInEst =
15850 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d   0;.    int nInM
15860 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  ul = 1;.    int 
15870 6e 42 6f 75 6e 64 20 3d 20 31 30 30 3b 0a 20 20  nBound = 100;.  
15880 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b    int bSort = 0;
15890 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70  .    int bLookup
158a0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 44 65   = 0;..    /* De
158b0 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
158c0 65 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49  es of nEq and nI
158d0 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nMul */.    for(
158e0 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62  nEq=0; nEq<pProb
158f0 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b  e->nColumn; nEq+
15900 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
15910 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
15920 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
15930 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
15940 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
15950 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
15960 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
15970 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
15980 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
15990 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
159a0 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49  , eqTermMask, pI
159b0 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
159c0 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
159d0 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
159e0 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
159f0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  EQ|WHERE_ROWID_E
15a00 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  Q);.      if( pT
15a10 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15a20 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
15a30 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15a40 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
15a50 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
15a60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
15a70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
15a80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15a90 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
15aa0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
15ab0 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20  nInMul *= 25;.  
15ac0 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d          bInEst =
15ad0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
15ae0 65 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70  e if( pExpr->x.p
15af0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
15b00 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70    nInMul *= pExp
15b10 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
15b20 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
15b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15b40 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
15b50 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
15b60 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
15b70 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
15b80 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _NULL;.      }. 
15b90 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65       used |= pTe
15ba0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
15bb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
15bc0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
15bd0 75 65 20 6f 66 20 6e 42 6f 75 6e 64 2e 20 2a 2f  ue of nBound. */
15be0 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
15bf0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
15c00 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
15c10 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
15c20 45 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66  Eq];.      if( f
15c30 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
15c40 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
15c50 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
15c60 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29  T|WO_GE, pIdx) )
15c70 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
15c80 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64  erm *pTop = find
15c90 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
15ca0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
15cb0 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b  LT|WO_LE, pIdx);
15cc0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
15cd0 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54  rm *pBtm = findT
15ce0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
15cf0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
15d00 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a  T|WO_GE, pIdx);.
15d10 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e          whereRan
15d20 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
15d30 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70  , pProbe, nEq, p
15d40 42 74 6d 2c 20 70 54 6f 70 2c 20 26 6e 42 6f 75  Btm, pTop, &nBou
15d50 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
15d60 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20   pTop ){.       
15d70 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
15d80 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
15d90 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
15da0 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67   pTop->prereqRig
15db0 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
15dc0 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
15dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
15de0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
15df0 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
15e00 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e    used |= pBtm->
15e10 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
15e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
15e30 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
15e40 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
15e50 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
15e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15e70 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
15e80 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
15e90 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
15ea0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
15eb0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
15ec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15ed0 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
15ee0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a  _COLUMN_NULL );.
15ef0 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
15f00 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
15f10 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
15f20 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a  MN_NULL))==0 ){.
15f30 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
15f40 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
15f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
15f60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15f70 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
15f80 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e  lause and the in
15f90 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  dex being consid
15fa0 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ered will.    **
15fb0 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20   naturally scan 
15fc0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
15fd0 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20  ired order, set 
15fe0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
15ff0 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20  flags.    ** in 
16000 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69  wsFlags. Otherwi
16010 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  se, if there is 
16020 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
16030 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65 78  se but the index
16040 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  .    ** will sca
16050 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66  n rows in a diff
16060 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74  erent order, set
16070 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69 61   the bSort varia
16080 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
16090 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
160a0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
160b0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
160c0 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
160d0 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20  NULL))==0.      
160e0 20 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49 6e    && isSortingIn
160f0 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e  dex(pParse,pWC->
16100 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c  pMaskSet,pProbe,
16110 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45  iCur,pOrderBy,nE
16120 71 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29 7b  q,&rev).      ){
16130 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
16140 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f   |= WHERE_ROWID_
16150 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
16160 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f  MN_RANGE|WHERE_O
16170 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
16180 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76 20  wsFlags |= (rev 
16190 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  ? WHERE_REVERSE 
161a0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
161b0 65 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74  e{.        bSort
161c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
161d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63    }..    /* If c
161e0 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61  urrently calcula
161f0 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f 66  ting the cost of
16200 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
16210 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20 20  (not the IPK.   
16220 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74 65   ** index), dete
16230 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65 71  rmine if all req
16240 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74  uired column dat
16250 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65  a may be obtaine
16260 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20 2a  d without .    *
16270 2a 20 73 65 65 6b 69 6e 67 20 74 6f 20 65 6e 74  * seeking to ent
16280 72 69 65 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ries in the main
16290 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66 20   table (i.e. if 
162a0 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 63  the index is a c
162b0 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69  overing.    ** i
162c0 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71 75  ndex for this qu
162d0 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20  ery). If it is, 
162e0 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49 44  set the WHERE_ID
162f0 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20  X_ONLY flag in. 
16300 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f     ** wsFlags. O
16310 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 74 68  therwise, set th
16320 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62  e bLookup variab
16330 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a  le to true.  */.
16340 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
16350 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  wsFlags ){.     
16360 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
16370 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
16380 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
16390 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
163a0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
163b0 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
163c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
163d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
163e0 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
163f0 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
16400 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
16410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16420 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
16430 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
16440 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
16450 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
16460 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20          bLookup 
16470 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16480 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 42 65   }..    /**** Be
16490 67 69 6e 20 61 64 64 69 6e 67 20 75 70 20 74 68  gin adding up th
164a0 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
164b0 74 68 69 73 20 69 6e 64 65 78 20 28 4e 65 65 64  this index (Need
164c0 73 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 29 0a  s improvements).
164d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 73      **.    ** Es
164e0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
164f0 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74  r of rows of out
16500 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 49 4e 20  put.  For an IN 
16510 6f 70 65 72 61 74 6f 72 2c 0a 20 20 20 20 2a 2a  operator,.    **
16520 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
16530 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64 20  estimate exceed 
16540 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e  half the rows in
16550 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
16560 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64  */.    nRow = (d
16570 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b  ouble)(aiRowEst[
16580 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a  nEq] * nInMul);.
16590 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20 26      if( bInEst &
165a0 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73  & nRow*2>aiRowEs
165b0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52  t[0] ){.      nR
165c0 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d  ow = aiRowEst[0]
165d0 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c  /2;.      nInMul
165e0 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20   = (int)(nRow / 
165f0 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a  aiRowEst[nEq]);.
16600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
16610 73 75 6d 65 20 63 6f 6e 73 74 61 6e 74 20 63 6f  sume constant co
16620 73 74 20 74 6f 20 61 63 63 65 73 73 20 61 20 72  st to access a r
16630 6f 77 20 61 6e 64 20 6c 6f 67 61 72 69 74 68 6d  ow and logarithm
16640 69 63 20 63 6f 73 74 20 74 6f 0a 20 20 20 20 2a  ic cost to.    *
16650 2a 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65  * do a binary se
16660 61 72 63 68 2e 20 20 48 65 6e 63 65 2c 20 74 68  arch.  Hence, th
16670 65 20 69 6e 69 74 69 61 6c 20 63 6f 73 74 20 69  e initial cost i
16680 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16690 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 72 6f  output.    ** ro
166a0 77 73 20 70 6c 75 73 20 6c 6f 67 32 28 74 61 62  ws plus log2(tab
166b0 6c 65 2d 73 69 7a 65 29 20 74 69 6d 65 73 20 74  le-size) times t
166c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e  he number of bin
166d0 61 72 79 20 73 65 61 72 63 68 65 73 2e 0a 20 20  ary searches..  
166e0 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d 20    */.    cost = 
166f0 6e 52 6f 77 20 2b 20 6e 49 6e 4d 75 6c 2a 65 73  nRow + nInMul*es
16700 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d  tLog(aiRowEst[0]
16710 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73  );..    /* Adjus
16720 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
16730 72 6f 77 73 20 61 6e 64 20 74 68 65 20 63 6f 73  rows and the cos
16740 74 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65  t downward to re
16750 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a  flect rows.    *
16760 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c 75  * that are exclu
16770 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e  ded by range con
16780 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f  straints..    */
16790 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f  .    nRow = (nRo
167a0 77 20 2a 20 28 64 6f 75 62 6c 65 29 6e 42 6f 75  w * (double)nBou
167b0 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31 30  nd) / (double)10
167c0 30 3b 0a 20 20 20 20 63 6f 73 74 20 3d 20 28 63  0;.    cost = (c
167d0 6f 73 74 20 2a 20 28 64 6f 75 62 6c 65 29 6e 42  ost * (double)nB
167e0 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29  ound) / (double)
167f0 31 30 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  100;..    /* Add
16800 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
16810 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  d cost of sortin
16820 67 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  g the result.   
16830 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53 6f 72   */.    if( bSor
16840 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20  t ){.      cost 
16850 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
16860 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ost);.    }..   
16870 20 2f 2a 20 49 66 20 61 6c 6c 20 69 6e 66 6f 72   /* If all infor
16880 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 74 61  mation can be ta
16890 6b 65 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ken directly fro
168a0 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 77 65 20  m the index, we 
168b0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 64 6f 69  avoid.    ** doi
168c0 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73  ng table lookups
168d0 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
168e0 74 68 65 20 63 6f 73 74 20 62 79 20 68 61 6c 66  the cost by half
168f0 2e 20 20 28 4e 6f 74 20 72 65 61 6c 6c 79 20 2d  .  (Not really -
16900 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6e 65 65  .    ** this nee
16910 64 73 20 74 6f 20 62 65 20 66 69 78 65 64 2e 29  ds to be fixed.)
16920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16930 70 49 64 78 20 26 26 20 62 4c 6f 6f 6b 75 70 3d  pIdx && bLookup=
16940 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  =0 ){.      cost
16950 20 2f 3d 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20   /= (double)2;. 
16960 20 20 20 7d 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43     }.    /**** C
16970 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69  ost of using thi
16980 73 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77 20  s index has now 
16990 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a  been computed **
169a0 2a 2a 2f 0a 0a 20 20 20 20 57 48 45 52 45 54 52  **/..    WHERETR
169b0 41 43 45 28 28 0a 20 20 20 20 20 20 22 74 62 6c  ACE((.      "tbl
169c0 3d 25 73 20 69 64 78 3d 25 73 20 6e 45 71 3d 25  =%s idx=%s nEq=%
169d0 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 6e 42 6f 75  d nInMul=%d nBou
169e0 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62  nd=%d bSort=%d b
169f0 4c 6f 6f 6b 75 70 3d 25 64 22 0a 20 20 20 20 20  Lookup=%d".     
16a00 20 22 20 77 73 46 6c 61 67 73 3d 25 64 20 20 20   " wsFlags=%d   
16a10 28 6e 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74 3d  (nRow=%.2f cost=
16a20 25 2e 32 66 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %.2f)\n",.      
16a30 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
16a40 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
16a50 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
16a60 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
16a70 4d 75 6c 2c 20 6e 42 6f 75 6e 64 2c 20 62 53 6f  Mul, nBound, bSo
16a80 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46  rt, bLookup, wsF
16a90 6c 61 67 73 2c 20 6e 52 6f 77 2c 20 63 6f 73 74  lags, nRow, cost
16aa0 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a  .    ));..    /*
16ab0 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   If this index i
16ac0 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68 61  s the best we ha
16ad0 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20  ve seen so far, 
16ae0 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73  then record this
16af0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e  .    ** index an
16b00 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68  d its cost in th
16b10 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75 72  e pCost structur
16b20 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
16b30 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c  ( (!pIdx || wsFl
16b40 61 67 73 29 20 26 26 20 63 6f 73 74 3c 70 43 6f  ags) && cost<pCo
16b50 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
16b60 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
16b70 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
16b80 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77  ost->nRow = nRow
16b90 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75  ;.      pCost->u
16ba0 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20  sed = used;.    
16bb0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
16bc0 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73  Flags = (wsFlags
16bd0 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20  &wsFlagMask);.  
16be0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
16bf0 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  nEq = nEq;.     
16c00 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
16c10 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
16c20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
16c30 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
16c40 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
16c50 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
16c60 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
16c70 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
16c80 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e     if( pSrc->pIn
16c90 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  dex ) break;..  
16ca0 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b 73    /* Reset masks
16cb0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e   for the next in
16cc0 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
16cd0 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73  */.    wsFlagMas
16ce0 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49  k = ~(WHERE_ROWI
16cf0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
16d00 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54  _RANGE);.    eqT
16d10 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54  ermMask = idxEqT
16d20 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20  ermMask;.  }..  
16d30 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
16d40 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
16d50 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  e and the SQLITE
16d60 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c  _ReverseOrder fl
16d70 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20  ag.  ** is set, 
16d80 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68 65  then reverse the
16d90 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 20   order that the 
16da0 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63  index will be sc
16db0 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54  anned.  ** in. T
16dc0 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
16dd0 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74  application test
16de0 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e  ing, to help fin
16df0 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65  d cases.  ** whe
16e00 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62  re application b
16e10 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73  ehaviour depends
16e20 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e   on the (undefin
16e30 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20  ed) order that. 
16e40 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75   ** SQLite outpu
16e50 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68  ts rows in in th
16e60 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20  e absence of an 
16e70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
16e80 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64    */.  if( !pOrd
16e90 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e  erBy && pParse->
16ea0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
16eb0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
16ec0 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  ){.    pCost->pl
16ed0 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  an.wsFlags |= WH
16ee0 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d  ERE_REVERSE;.  }
16ef0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ..  assert( pOrd
16f00 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e  erBy || (pCost->
16f10 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
16f20 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29  RE_ORDERBY)==0 )
16f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 73  ;.  assert( pCos
16f40 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
16f50 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61  0 || (pCost->pla
16f60 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  n.wsFlags&WHERE_
16f70 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a  ROWID_EQ)==0 );.
16f80 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
16f90 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20  pIndex==0 .     
16fa0 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e    || pCost->plan
16fb0 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20  .u.pIdx==0 .    
16fc0 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61     || pCost->pla
16fd0 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e  n.u.pIdx==pSrc->
16fe0 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20  pIndex .  );..  
16ff0 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
17000 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e  t index is: %s\n
17010 22 2c 20 0a 20 20 20 20 28 70 43 6f 73 74 2d 3e  ", .    (pCost->
17020 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 43  plan.u.pIdx ? pC
17030 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
17040 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29  ->zName : "ipk")
17050 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73 74  .  ));.  .  best
17060 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50  OrClauseIndex(pP
17070 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
17080 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65   notReady, pOrde
17090 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70  rBy, pCost);.  p
170a0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
170b0 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b  gs |= eqTermMask
170c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
170d0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
170e0 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62  or accessing tab
170f0 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57  le pSrc->pTab. W
17100 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
17110 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
17120 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
17130 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
17140 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ct supplied .** 
17150 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61  as the last para
17160 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  meter. This func
17170 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61  tion may calcula
17180 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a  te the cost of.*
17190 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20  * both real and 
171a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63  virtual table sc
171b0 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ans..*/.static v
171c0 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20  oid bestIndex(. 
171d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171f0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
17200 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
17210 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
17220 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
17230 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
17240 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
17250 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
17260 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
17270 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
17280 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
17290 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
172a0 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
172b0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61  that are not ava
172c0 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  ilable */.  Expr
172d0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
172e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
172f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
17300 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
17310 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Cost            
17320 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
17330 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
17340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17350 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17360 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
17370 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a  (pSrc->pTab) ){.
17380 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
17390 78 5f 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20  x_info *p = 0;. 
173a0 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e     bestVirtualIn
173b0 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
173c0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
173d0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
173e0 2c 20 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70  , &p);.    if( p
173f0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
17400 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  tr ){.      sqli
17410 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53  te3_free(p->idxS
17420 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  tr);.    }.    s
17430 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17440 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  rse->db, p);.  }
17450 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
17460 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
17470 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
17480 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
17490 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29  pOrderBy, pCost)
174a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
174b0 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
174c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
174d0 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
174e0 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
174f0 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
17500 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
17510 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
17520 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
17530 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
17540 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
17550 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
17560 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
17570 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
17580 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
17590 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
175a0 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
175b0 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
175c0 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
175d0 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
175e0 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
175f0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
17600 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
17610 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
17620 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
17630 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
17640 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
17650 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
17660 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
17670 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
17680 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
17690 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
176a0 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
176b0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
176c0 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
176d0 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
176e0 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
176f0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
17700 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
17710 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
17720 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
17730 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
17740 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
17750 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
17760 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
17770 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
17780 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
17790 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
177a0 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
177b0 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
177c0 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
177d0 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
177e0 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
177f0 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
17800 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
17810 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
17820 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
17830 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
17840 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
17850 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
17860 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
17870 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
17880 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
17890 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
178a0 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
178b0 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
178c0 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
178d0 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
178e0 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
178f0 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
17900 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
17910 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
17920 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
17930 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
17940 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
17950 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 41  pTerm.      && A
17960 4c 57 41 59 53 28 28 70 54 65 72 6d 2d 3e 77 74  LWAYS((pTerm->wt
17970 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
17980 45 44 29 3d 3d 30 29 0a 20 20 20 20 20 20 26 26  ED)==0).      &&
17990 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a   (pLevel->iLeftJ
179a0 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61  oin==0 || ExprHa
179b0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
179c0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
179d0 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70  oin)).  ){.    p
179e0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
179f0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
17a00 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
17a10 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
17a20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
17a30 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
17a40 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
17a50 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
17a60 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
17a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
17a80 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
17a90 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
17aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17ab0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
17ac0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
17ad0 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63  e to apply the c
17ae0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
17af0 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f  tring zAff.** to
17b00 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72 73   the n registers
17b10 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61 73   starting at bas
17b20 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20  e. .**.** As an 
17b30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51  optimization, SQ
17b40 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
17b50 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72 65  tries (which are
17b60 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65 0a   no-ops) at the.
17b70 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  ** beginning and
17b80 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72 65   end of zAff are
17b90 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c   ignored.  If al
17ba0 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41 66  l entries in zAf
17bb0 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f are.** SQLITE_
17bc0 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e  AFF_NONE, then n
17bd0 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e 65  o code gets gene
17be0 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rated..**.** Thi
17bf0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
17c00 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
17c10 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68 65  zAff so that the
17c20 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65 0a   caller is free.
17c30 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66  ** to modify zAf
17c40 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  f after this rou
17c50 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tine returns..*/
17c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
17c70 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50  eApplyAffinity(P
17c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17c90 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63  t base, int n, c
17ca0 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64  har *zAff){.  Vd
17cb0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
17cc0 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41 66  pVdbe;.  if( zAf
17cd0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
17ce0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
17cf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
17d00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
17d10 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
17d20 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20 62  ;..  /* Adjust b
17d30 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69  ase and n to ski
17d40 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41 46  p over SQLITE_AF
17d50 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 61  F_NONE entries a
17d60 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
17d70 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20    ** and end of 
17d80 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
17d90 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ing..  */.  whil
17da0 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30  e( n>0 && zAff[0
17db0 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
17dc0 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
17dd0 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a     base++;.    z
17de0 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69  Aff++;.  }.  whi
17df0 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b  le( n>1 && zAff[
17e00 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  n-1]==SQLITE_AFF
17e10 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
17e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65  ;.  }..  /* Code
17e30 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
17e40 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72 65   opcode if there
17e50 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65 66   is anything lef
17e60 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66  t to do. */.  if
17e70 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n>0 ){.    sql
17e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17e90 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
17ea0 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
17eb0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
17ec0 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29  (v, -1, zAff, n)
17ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
17ee0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17ef0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61 73  ange(pParse, bas
17f00 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e, n);.  }.}.../
17f10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17f20 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
17f30 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
17f40 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
17f50 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
17f60 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
17f70 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
17f80 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
17f90 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
17fa0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
17fb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
17fc0 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
17fd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
17fe0 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
17ff0 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
18000 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
18010 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
18020 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18030 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
18040 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
18050 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
18060 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
18070 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
18080 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
18090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
180a0 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
180b0 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
180c0 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
180d0 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
180e0 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
180f0 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
18100 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
18110 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
18120 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
18130 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
18140 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
18150 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
18160 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
18170 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
18180 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
18190 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
181a0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
181b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  n */.  int iTarg
181c0 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
181d0 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
181e0 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
181f0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
18200 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
18210 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
18220 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
18230 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
18260 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
18270 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
18280 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
18290 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
182a0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
182b0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
182c0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
182d0 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
182e0 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
182f0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
18300 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
18310 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
18320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18330 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
18340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18350 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
18360 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
18370 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
18380 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
18390 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
183a0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
183b0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
183c0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
183d0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
183e0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
183f0 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
18400 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
18410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
18430 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
18440 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
18450 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
18460 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
18470 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
18480 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
18490 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
184a0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
184b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
184c0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
184d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
184e0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
184f0 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
18500 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
18510 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
18520 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
18530 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
18560 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
18570 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
18580 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
18590 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
185a0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
185b0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
185c0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
185d0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
185e0 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
185f0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
18600 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
18610 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
18620 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
18630 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
18640 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
18650 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
18660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18670 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
18680 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
18690 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
186a0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
186b0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
186c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
186d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
186e0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
186f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
18700 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
18710 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18720 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
18730 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
18740 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
18750 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18760 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18770 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
18780 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
18790 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
187a0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  dex..**.** For e
187b0 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72  xample, consider
187c0 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c   table t1(a,b,c,
187d0 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65  d,e,f) with inde
187e0 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20  x i1(a,b,c)..** 
187f0 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52  Suppose the WHER
18800 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73  E clause is this
18810 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e  :  a==5 AND b IN
18820 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35   (1,2,3) AND c>5
18830 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65   AND c<10.** The
18840 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61   index has as ma
18850 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61  ny as three equa
18860 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
18870 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a  , but in this.**
18880 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68   example, the th
18890 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73  ird "c" value is
188a0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
188b0 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a   So only two .**
188c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
188d0 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f   coded.  This ro
188e0 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72  utine will gener
188f0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
18900 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64  uate.** a==5 and
18910 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20   b IN (1,2,3).  
18920 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
18930 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77  es for a and b w
18940 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a  ill be stored.**
18950 20 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20   in consecutive 
18960 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
18970 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
18980 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73  irst register is
18990 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
189a0 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
189b0 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
189c0 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
189d0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
189e0 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
189f0 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
18a00 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
18a10 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
18a20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
18a30 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
18a40 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
18a50 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
18a60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
18a70 0a 2a 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20  .** compute the 
18a80 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
18a90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18aa0 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
18ab0 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
18ac0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
18ad0 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
18ae0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d   index of that m
18af0 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20  emory cell. The 
18b00 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
18b10 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
18b20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65  will use that me
18b30 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f  mory cell to sto
18b40 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
18b50 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
18b60 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
18b70 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
18b80 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
18b90 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
18ba0 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
18bb0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
18bc0 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
18bd0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
18be0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
18bf0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
18c00 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
18c10 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
18c20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
18c30 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
18c40 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
18c50 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
18c60 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
18c70 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
18c80 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
18c90 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
18ca0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
18cb0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
18cc0 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
18cd0 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
18ce0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
18cf0 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
18d00 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
18d10 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
18d20 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
18d30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
18d40 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
18d50 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
18d60 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
18d70 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
18d80 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
18d90 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
18da0 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
18db0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
18dc0 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
18dd0 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
18de0 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
18df0 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
18e00 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
18e10 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
18e20 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
18e30 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
18e40 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
18e50 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
18e60 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
18e70 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
18e80 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
18e90 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
18ea0 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
18eb0 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
18ec0 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
18ed0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
18ee0 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
18ef0 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
18f00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
18f10 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
18f20 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
18f30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18f40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18f50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f60 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
18f70 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
18f80 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
18f90 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
18fa0 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
18fb0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
18fc0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
18fd0 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
18fe0 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
18ff0 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
19000 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
19010 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
19020 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67  .  int nExtraReg
19030 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
19040 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69  er of extra regi
19050 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
19060 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
19070 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Aff          /* 
19080 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e  OUT: Set to poin
19090 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73 74  t to affinity st
190a0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
190b0 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   nEq = pLevel->p
190c0 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68  lan.nEq;   /* Th
190d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
190e0 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
190f0 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64   to code */.  Vd
19100 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
19110 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
19120 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73  he vm under cons
19130 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
19140 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
19150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19160 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
19170 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
19180 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
19190 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
191a0 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
191b0 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
191c0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
191d0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
191e0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
191f0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
19200 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19230 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  r */.  int regBa
19240 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
19250 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
19260 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ister */.  int n
19270 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
19280 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19290 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  er of registers 
192a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
192b0 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20   char *zAff;    
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192d0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
192e0 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  g to return */..
192f0 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65    /* This module
19300 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
19310 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74  on query plans t
19320 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  hat use an index
19330 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
19340 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
19350 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
19360 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d 20  XED );.  pIdx = 
19370 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
19380 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  Idx;..  /* Figur
19390 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
193a0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
193b0 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
193c0 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
193d0 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70 50  /.  regBase = pP
193e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
193f0 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d    nReg = pLevel-
19400 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74  >plan.nEq + nExt
19410 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d  raReg;.  pParse-
19420 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a  >nMem += nReg;..
19430 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33    zAff = sqlite3
19440 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
19450 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65  >db, sqlite3Inde
19460 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
19470 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a  pIdx));.  if( !z
19480 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Aff ){.    pPars
19490 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
194a0 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  led = 1;.  }..  
194b0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
194c0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
194d0 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
194e0 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
194f0 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
19500 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
19510 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20  {.    int r1;.  
19520 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
19530 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
19540 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
19550 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
19560 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
19570 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20  ->plan.wsFlags, 
19580 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 4e  pIdx);.    if( N
19590 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20 29  EVER(pTerm==0) )
195a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
195b0 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
195c0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
195d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20 3d  )==0 );.    r1 =
195e0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
195f0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
19600 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65   pLevel, regBase
19610 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21  +j);.    if( r1!
19620 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20  =regBase+j ){.  
19630 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20      if( nReg==1 
19640 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19650 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19660 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
19670 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61  );.        regBa
19680 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d  se = r1;.      }
19690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
196a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
196b0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  v, OP_SCopy, r1,
196c0 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20   regBase+j);.   
196d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
196e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
196f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
19700 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73  SNULL );.    tes
19710 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
19720 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
19730 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
19740 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
19750 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
19760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
19770 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
19780 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
19790 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
197a0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
197b0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
197c0 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d  gBase+j, pLevel-
197d0 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20  >addrBrk);.     
197e0 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20   if( zAff ){.   
197f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19800 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
19810 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29  pRight, zAff[j])
19820 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
19830 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
19840 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
19850 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
19860 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
19870 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
19880 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
19890 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d  (pRight, zAff[j]
198a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
198b0 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f  Aff[j] = SQLITE_
198c0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
198d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
198e0 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
198f0 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
19900 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  regBase;.}../*.*
19910 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19920 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
19930 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
19940 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
19950 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
19960 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
19970 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
19980 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
19990 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
199a0 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
199b0 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
199c0 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
199d0 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
199e0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
199f0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
19a00 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
19a10 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
19a20 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
19a30 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
19a40 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e  lags,      /* On
19a50 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
19a60 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
19a70 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
19a80 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
19a90 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
19aa0 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
19ab0 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
19ac0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
19ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19ae0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19af0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
19b00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
19b10 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
19b20 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
19b30 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
19b40 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
19b50 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
19b60 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
19b70 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
19b80 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
19b90 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
19ba0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
19bb0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
19bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19bd0 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
19be0 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
19bf0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
19c00 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
19c10 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
19c20 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
19c30 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
19c40 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
19c50 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
19c60 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
19c70 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
19c80 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
19c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19ca0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
19cb0 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
19cc0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
19cd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19ce0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56  g context */.  V
19cf0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d10 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
19d20 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
19d30 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
19d40 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19d50 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
19d60 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
19d70 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
19d80 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
19db0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
19dc0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
19dd0 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19df0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
19e00 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
19e10 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
19e20 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
19e30 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
19e40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
19e50 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
19e60 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
19e70 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
19e80 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
19e90 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
19ea0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
19eb0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
19ec0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
19ed0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
19ee0 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66  e;.  pWC = pWInf
19ef0 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c  o->pWC;.  pLevel
19f00 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
19f10 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65  evel];.  pTabIte
19f20 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
19f30 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
19f40 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
19f50 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
19f60 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  sor;.  bRev = (p
19f70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
19f80 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
19f90 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54  RSE)!=0;.  omitT
19fa0 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
19fb0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
19fc0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
19fd0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
19fe0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
19ff0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
1a000 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  )==0;..  /* Crea
1a010 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
1a020 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
1a030 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
1a040 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
1a050 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
1a060 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
1a070 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
1a080 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
1a090 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
1a0a0 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
1a0b0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
1a0c0 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
1a0d0 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
1a0e0 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
1a0f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
1a100 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
1a110 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
1a120 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
1a130 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
1a140 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
1a150 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
1a160 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
1a170 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
1a180 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
1a190 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
1a1a0 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
1a1b0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
1a1c0 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
1a1d0 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1a1e0 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
1a1f0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
1a200 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a210 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
1a220 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1a230 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
1a240 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a250 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1a260 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1a270 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
1a280 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
1a290 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
1a2a0 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
1a2b0 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
1a2c0 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
1a2d0 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
1a2e0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
1a2f0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
1a300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
1a310 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
1a320 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
1a330 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
1a340 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
1a350 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
1a360 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1a370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a380 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1a390 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
1a3a0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
1a3b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
1a3c0 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
1a3d0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
1a3e0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1a3f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1a400 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1a410 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1a420 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1a430 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
1a440 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
1a450 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
1a460 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
1a470 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
1a480 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
1a490 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
1a4a0 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
1a4b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
1a4c0 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
1a4d0 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
1a4e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  .    sqlite3_ind
1a4f0 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64  ex_info *pVtabId
1a500 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1a510 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20  .u.pVtabIdx;.   
1a520 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1a530 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f   = pVtabIdx->nCo
1a540 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74  nstraint;.    st
1a550 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1a560 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
1a570 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
1a5b0 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
1a5c0 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f  intUsage;.    co
1a5d0 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
1a5e0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1a5f0 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74  int *aConstraint
1a600 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
1a640 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 69  nstraint;..    i
1a650 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1a660 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1a670 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
1a680 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
1a690 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  <=nConstraint; j
1a6a0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ++){.      for(k
1a6b0 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; k<nConstrain
1a6c0 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; k++){.       
1a6d0 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61   if( aUsage[k].a
1a6e0 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20  rgvIndex==j ){. 
1a6f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65           int iTe
1a700 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
1a710 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [k].iTermOffset;
1a720 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1a730 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1a740 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e, pWC->a[iTerm]
1a750 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  .pExpr->pRight, 
1a760 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20  iReg+j+1);.     
1a770 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a780 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a790 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
1a7a0 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
1a7b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a7d0 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62  P_Integer, pVtab
1a7e0 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65  Idx->idxNum, iRe
1a7f0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
1a800 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a810 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
1a820 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
1a830 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a840 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
1a850 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c  , addrBrk, iReg,
1a860 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
1a870 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1a880 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
1a890 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
1a8a0 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
1a8b0 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1a8c0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
1a8d0 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
1a8e0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1a8f0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
1a900 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
1a910 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
1a920 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65  .        int iTe
1a930 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
1a940 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [j].iTermOffset;
1a950 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
1a960 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57  Term(pLevel, &pW
1a970 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20  C->a[iTerm]);.  
1a980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a990 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1a9a0 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
1a9b0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1a9c0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
1a9d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1a9e0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
1a9f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1aa00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
1aa10 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
1aa20 32 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  2);.  }else.#end
1aa30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1aa40 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1aa50 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  /..  if( pLevel-
1aa60 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1aa70 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
1aa80 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
1aa90 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
1aaa0 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
1aab0 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
1aac0 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1aad0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
1aae0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
1aaf0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
1ab00 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
1ab10 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
1ab20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
1ab30 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
1ab40 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
1ab50 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
1ab60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65  ..    */.    iRe
1ab70 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
1ab80 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1ab90 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  rse);.    pTerm 
1aba0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1abb0 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
1abc0 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
1abd0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1abe0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1abf0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
1ac00 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1ac10 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c  assert( pTerm->l
1ac20 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1ac30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
1ac40 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
1ac50 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
1ac60 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1ac70 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1ac80 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52  Level, iReleaseR
1ac90 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
1aca0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1acb0 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
1acc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1acd0 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69  MustBeInt, iRowi
1ace0 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a  dReg, addrNxt);.
1acf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ad00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
1ad10 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
1ad20 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
1ad30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1ad40 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1ad50 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1ad60 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
1ad70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1ad80 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
1ad90 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1ada0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
1adb0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1adc0 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
1add0 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ANGE ){.    /* C
1ade0 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
1adf0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
1ae00 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1ae10 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1ae20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1ae30 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
1ae40 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
1ae50 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
1ae60 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
1ae70 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
1ae80 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
1ae90 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
1aea0 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74  =0 );.    pStart
1aeb0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1aec0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
1aed0 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
1aee0 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  , 0);.    pEnd =
1aef0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
1af00 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
1af10 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
1af20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  0);.    if( bRev
1af30 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
1af40 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
1af50 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
1af60 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
1af70 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
1af80 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1af90 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1afa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
1afb0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
1afc0 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
1afd0 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
1afe0 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
1aff0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1b000 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
1b010 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
1b020 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
1b030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1b040 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
1b050 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
1b060 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
1b070 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
1b080 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
1b090 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
1b0a0 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
1b0b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1b0c0 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
1b0d0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
1b0e0 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
1b0f0 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
1b100 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
1b110 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
1b120 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
1b130 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
1b140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1b150 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
1b160 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
1b170 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
1b180 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
1b190 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
1b1a0 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
1b1b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1b1c0 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
1b1d0 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
1b1e0 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
1b1f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b200 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
1b210 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1b220 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
1b230 0a 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ..      pX = pSt
1b240 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1b250 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1b260 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b270 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1b280 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
1b290 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1b2a0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1b2b0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1b2c0 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1b2d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b2e0 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1b2f0 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1b300 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1b310 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1b320 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1b330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b340 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1b350 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1b360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1b370 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b380 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1b390 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1b3a0 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1b3b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b3c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b3d0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1b3e0 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1b3f0 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1b400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b410 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
1b420 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
1b430 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
1b440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b450 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1b460 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
1b470 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1b480 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
1b490 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
1b4a0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1b4b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1b4c0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
1b4d0 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
1b4e0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
1b4f0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
1b500 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
1b510 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
1b520 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
1b530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b540 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1b550 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
1b560 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1b570 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1b580 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
1b590 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
1b5a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1b5b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
1b5c0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
1b5d0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
1b5e0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
1b5f0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
1b600 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
1b610 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1b620 35 20 3d 20 28 70 53 74 61 72 74 3d 3d 30 20 26  5 = (pStart==0 &
1b630 26 20 70 45 6e 64 3d 3d 30 29 20 3f 31 3a 30 3b  & pEnd==0) ?1:0;
1b640 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21  .    if( testOp!
1b650 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
1b660 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
1b670 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
1b680 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1b690 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1b6a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b6b0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
1b6c0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1b6d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b6e0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1b6f0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1b700 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1b710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b720 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e  v, testOp, memEn
1b730 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c  dValue, addrBrk,
1b740 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1b750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1b760 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
1b770 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
1b780 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1b790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1b7a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1b7b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
1b7c0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
1b7d0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
1b7e0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1b7f0 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  3: A scan using 
1b800 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1b810 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1b820 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1b830 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1b840 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1b850 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1b860 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1b870 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1b880 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1b890 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1b8a0 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1b8b0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1b8c0 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1b8d0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1b8e0 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1b8f0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1b900 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1b910 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1b920 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1b930 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1b940 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1b950 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1b960 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1b970 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1b980 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1b990 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1b9a0 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1b9b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1b9c0 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1b9d0 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1b9e0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1b9f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1ba00 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1ba10 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1ba20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1ba30 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1ba40 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1ba50 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1ba60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1ba70 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1ba80 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1ba90 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1baa0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1bab0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1bac0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1bad0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1bae0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1baf0 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1bb00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1bb10 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1bb20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1bb30 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1bb40 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1bb50 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1bb60 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1bb70 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1bb80 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1bb90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1bba0 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1bbb0 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1bbc0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1bbd0 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1bbe0 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1bbf0 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1bc00 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1bc10 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1bc20 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1bc30 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1bc40 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1bc50 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1bc60 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1bc70 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1bc80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bc90 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1bca0 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1bcb0 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1bcc0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1bcd0 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1bce0 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1bcf0 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1bd00 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1bd10 20 20 0a 20 20 20 20 69 6e 74 20 61 53 74 61 72    .    int aStar
1bd20 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
1bd30 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
1bd40 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
1bd50 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
1bd60 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1bd70 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1bd80 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1bd90 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
1bda0 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
1bdb0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1bdc0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
1bdd0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1bde0 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
1bdf0 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
1be00 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1be10 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
1be20 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1be30 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
1be40 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
1be50 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1be60 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1be70 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1be80 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
1be90 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
1bea0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1beb0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1bec0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1bed0 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1bee0 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
1bef0 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1bf00 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1bf10 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 61      };.    int a
1bf20 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1bf30 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1bf40 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1bf50 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1bf60 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1bf70 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1bf80 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1bf90 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1bfa0 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfc0 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1bfd0 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1bfe0 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1bff0 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
1c000 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20 69  n.nEq;.    int i
1c010 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
1c020 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c030 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
1c040 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
1c050 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
1c060 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1c070 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1c080 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1c090 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
1c0a0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
1c0d0 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
1c0e0 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
1c0f0 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
1c100 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c110 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
1c120 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
1c130 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
1c140 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
1c150 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1c160 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
1c170 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1c1a0 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
1c1b0 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1c1c0 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c1e0 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
1c1f0 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
1c200 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1c210 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1c220 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
1c230 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
1c240 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
1c250 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1c260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c270 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1c280 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
1c290 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
1c2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1c2b0 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1c2c0 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1c2d0 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1c2e0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
1c2f0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
1c300 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
1c310 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 2f  xtraReg = 0;   /
1c320 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1c330 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1c340 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1c350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c360 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
1c370 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
1c380 20 2a 7a 41 66 66 3b 0a 0a 20 20 20 20 70 49 64   *zAff;..    pId
1c390 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1c3a0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
1c3b0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1c3c0 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
1c3d0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1c3e0 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75  Eq];     /* Colu
1c3f0 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74  mn for inequalit
1c400 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
1c410 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c420 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1c430 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1c440 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1c450 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1c460 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1c470 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1c480 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1c490 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1c4a0 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1c4b0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1c4c0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1c4d0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1c4e0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1c4f0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1c500 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1c510 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1c520 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1c530 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1c540 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1c550 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1c560 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1c570 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1c580 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1c590 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1c5a0 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1c5b0 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1c5c0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1c5d0 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1c5e0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1c5f0 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
1c600 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
1c610 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1c620 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1c630 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49  RBY).     && (pI
1c640 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
1c650 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
1c660 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c670 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
1c680 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
1c690 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
1c6a0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
1c6b0 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
1c6c0 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
1c6d0 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
1c6e0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1c6f0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1c700 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
1c710 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1c720 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
1c730 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
1c740 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
1c750 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
1c760 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1c770 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1c780 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1c790 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1c7a0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1c7b0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
1c7c0 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
1c7d0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
1c7e0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1c7f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
1c800 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1c810 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1c820 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1c830 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
1c840 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
1c850 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
1c860 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
1c870 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1c880 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1c890 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1c8a0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
1c8b0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
1c8c0 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
1c8d0 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
1c8e0 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
1c8f0 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
1c900 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
1c910 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
1c920 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
1c930 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
1c940 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
1c950 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
1c960 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
1c970 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
1c980 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26  dy, nExtraReg, &
1c990 7a 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  zAff.    );.    
1c9a0 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1c9b0 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
1c9c0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1c9d0 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
1c9e0 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
1c9f0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
1ca00 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
1ca10 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
1ca20 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
1ca30 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
1ca40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1ca50 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
1ca60 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
1ca70 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
1ca80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52 65    */.    if( bRe
1ca90 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
1caa0 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
1cab0 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20  E_SO_ASC) ){.   
1cac0 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
1cad0 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
1cae0 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1caf0 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
1cb00 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1cb10 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
1cb20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
1cb30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1cb40 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
1cb50 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
1cb60 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
1cb70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cb80 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
1cb90 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1cba0 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
1cbb0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1cbc0 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
1cbd0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1cbe0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61  WO_GE );.    sta
1cbf0 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1cc00 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1cc10 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1cc20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1cc30 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1cc40 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1cc50 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1cc60 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1cc70 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1cc80 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1cc90 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1cca0 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1ccb0 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1ccc0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1ccd0 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1cce0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1ccf0 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1cd00 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1cd10 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1cd20 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1cd30 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1cd40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cd50 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1cd60 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1cd70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1cd80 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
1cd90 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
1cda0 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
1cdb0 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
1cdc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1cdd0 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1cde0 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
1cdf0 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29 3d  f[nConstraint])=
1ce00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
1ce10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ce20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72  Since the compar
1ce30 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65  ison is to be pe
1ce40 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20  rformed with no 
1ce50 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20  conversions.    
1ce60 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64        ** applied
1ce70 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
1ce80 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
1ce90 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
1cea0 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
1ceb0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
1cec0 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
1ced0 20 20 20 20 20 20 7a 41 66 66 5b 6e 43 6f 6e 73        zAff[nCons
1cee0 74 72 61 69 6e 74 5d 20 3d 20 53 51 4c 49 54 45  traint] = SQLITE
1cef0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
1cf00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1cf10 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
1cf20 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
1cf30 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6e  e(pRight, zAff[n
1cf40 43 6f 6e 73 74 72 61 69 6e 74 5d 29 20 29 7b 0a  Constraint]) ){.
1cf50 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6e            zAff[n
1cf60 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53 51  Constraint] = SQ
1cf70 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1cf80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cf90 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72    .      nConstr
1cfa0 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  aint++;.    }els
1cfb0 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79  e if( isMinQuery
1cfc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1cfd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cfe0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
1cff0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e  se+nEq);.      n
1d000 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1d010 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b      startEq = 0;
1d020 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e  .      start_con
1d030 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
1d040 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c    }.    codeAppl
1d050 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1d060 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
1d070 74 72 61 69 6e 74 2c 20 7a 41 66 66 29 3b 0a 20  traint, zAff);. 
1d080 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70     op = aStartOp
1d090 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  [(start_constrai
1d0a0 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74  nts<<2) + (start
1d0b0 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a  Eq<<1) + bRev];.
1d0c0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d      assert( op!=
1d0d0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1d0e0 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
1d0f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1d100 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
1d110 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
1d120 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a  p==OP_SeekGt );.
1d130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d140 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20  ==OP_SeekGe );. 
1d150 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d160 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20  =OP_SeekLe );.  
1d170 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1d180 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20  OP_SeekLt );.   
1d190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d1a0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
1d1b0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
1d1c0 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
1d1d0 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  int);..    /* Lo
1d1e0 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ad the value for
1d1f0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
1d200 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68  constraint at th
1d210 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
1d220 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e   ** range (if an
1d230 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  y)..    */.    n
1d240 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1d250 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1d260 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70  End ){.      Exp
1d270 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
1d280 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52  geEnd->pExpr->pR
1d290 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  ight;.      sqli
1d2a0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1d2b0 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
1d2c0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73  se+nEq);.      s
1d2d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1d2e0 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
1d2f0 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
1d300 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d310 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20  deIsNullJump(v, 
1d320 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1d330 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1d340 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b       if( zAff ){
1d350 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d360 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1d370 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
1d380 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29 3d 3d  [nConstraint])==
1d390 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
1d3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1d3b0 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
1d3c0 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
1d3d0 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
1d3e0 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
1d3f0 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
1d400 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
1d410 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
1d420 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
1d430 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
1d440 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
1d450 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
1d460 20 20 20 20 20 7a 41 66 66 5b 6e 43 6f 6e 73 74       zAff[nConst
1d470 72 61 69 6e 74 5d 20 3d 20 53 51 4c 49 54 45 5f  raint] = SQLITE_
1d480 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1d490 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d4a0 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
1d4b0 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
1d4c0 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6e 43  (pRight, zAff[nC
1d4d0 6f 6e 73 74 72 61 69 6e 74 5d 29 20 29 7b 0a 20  onstraint]) ){. 
1d4e0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6e 43           zAff[nC
1d4f0 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53 51 4c  onstraint] = SQL
1d500 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
1d510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1d520 20 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c   .      codeAppl
1d530 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
1d540 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31  , regBase, nEq+1
1d550 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 6e  , zAff);.      n
1d560 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1d570 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1d580 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1d590 2c 20 7a 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  , zAff);..    /*
1d5a0 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
1d5b0 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
1d5c0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1d5d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1d5e0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
1d5f0 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
1d600 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
1d610 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
1d620 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
1d630 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
1d640 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
1d650 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
1d660 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
1d670 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
1d680 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1d690 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1d6a0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
1d6b0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
1d6c0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1d6d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d6e0 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78  4Int(v, op, iIdx
1d6f0 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65  Cur, addrNxt, re
1d700 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
1d710 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1d720 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1d730 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31  , endEq!=bRev ?1
1d740 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  :0);.    }..    
1d750 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1d760 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1d770 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
1d780 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
1d790 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
1d7a0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
1d7b0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74   inequality cont
1d7c0 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c  rains is not NUL
1d7d0 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  L..    ** If it 
1d7e0 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
1d7f0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1d800 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
1d810 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  */.    r1 = sqli
1d820 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1d830 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63  arse);.    testc
1d840 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ase( pLevel->pla
1d850 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1d860 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_BTM_LIMIT );. 
1d870 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
1d880 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1d890 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1d8a0 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70  MIT );.    if( p
1d8b0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1d8c0 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d  ags & (WHERE_BTM
1d8d0 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50  _LIMIT|WHERE_TOP
1d8e0 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20  _LIMIT) ){.     
1d8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d900 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1d910 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
1d920 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1d930 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d940 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
1d950 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
1d960 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1d970 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1d980 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
1d990 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
1d9a0 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
1d9b0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
1d9c0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
1d9d0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
1d9e0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1d9f0 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
1da00 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
1da10 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1da20 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1da30 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1da40 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1da50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
1da70 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
1da80 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1da90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1daa0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1dab0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1dac0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1dad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dae0 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
1daf0 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
1db00 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
1db10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1db20 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
1db30 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
1db40 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1db50 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
1db60 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
1db70 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
1db80 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
1db90 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
1dba0 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   */.    pLevel->
1dbb0 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50  op = bRev ? OP_P
1dbc0 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20  rev : OP_Next;. 
1dbd0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1dbe0 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65  iIdxCur;.  }else
1dbf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1dc00 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1dc10 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76  ATION.  if( pLev
1dc20 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1dc30 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
1dc40 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
1dc50 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   4:  Two or more
1dc60 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
1dc70 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
1dc80 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
1dc90 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1dca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1dcb0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1dcc0 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
1dcd0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1dce0 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
1dcf0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
1dd00 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
1dd10 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
1dd20 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
1dd30 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
1dd40 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1dd50 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
1dd60 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
1dd70 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
1dd80 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
1dd90 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
1dda0 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
1ddb0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
1ddc0 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
1ddd0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
1dde0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
1ddf0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1de00 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
1de10 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
1de20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
1de30 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
1de40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1de50 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
1de60 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
1de70 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
1de80 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
1de90 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
1dea0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
1deb0 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
1dec0 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
1ded0 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
1dee0 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
1def0 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
1df00 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
1df10 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
1df20 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
1df30 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
1df40 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
1df50 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
1df60 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
1df70 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1df80 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
1df90 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
1dfa0 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1dfc0 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
1dfd0 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
1dfe0 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
1dff0 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
1e000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1e010 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
1e020 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
1e030 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
1e040 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1e050 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
1e060 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
1e070 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
1e080 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
1e090 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
1e0a0 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
1e0b0 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
1e0c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
1e0d0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
1e0e0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
1e0f0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
1e100 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
1e110 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
1e140 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
1e150 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
1e160 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
1e170 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
1e180 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
1e190 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
1e1a0 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
1e1b0 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
1e1c0 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
1e1d0 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
1e1e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1e1f0 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
1e200 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
1e210 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
1e220 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
1e230 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
1e240 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
1e250 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
1e260 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69    WhereTerm *pFi
1e270 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69 6e 61  nal;     /* Fina
1e280 6c 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e  l subterm within
1e290 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 2e 20   the OR-clause. 
1e2a0 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 6f  */.    SrcList o
1e2b0 6e 65 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a  neTab;        /*
1e2c0 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
1e2d0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 69 6e   list */..    in
1e2e0 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
1e2f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
1e300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1e310 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
1e320 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
1e330 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1e360 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
1e370 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
1e380 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1e3b0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
1e3c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
1e3d0 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
1e3e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1e3f0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
1e400 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
1e410 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1e440 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
1e450 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
1e460 20 69 69 3b 0a 20 20 20 0a 20 20 20 20 70 54 65   ii;.   .    pTe
1e470 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  rm = pLevel->pla
1e480 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61  n.u.pTerm;.    a
1e490 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1e4a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e4b0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
1e4c0 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73  =WO_OR );.    as
1e4d0 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74  sert( (pTerm->wt
1e4e0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
1e4f0 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  NFO)!=0 );.    p
1e500 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75  OrWc = &pTerm->u
1e510 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  .pOrInfo->wc;.  
1e520 20 20 70 46 69 6e 61 6c 20 3d 20 26 70 4f 72 57    pFinal = &pOrW
1e530 63 2d 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54 65 72  c->a[pOrWc->nTer
1e540 6d 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  m-1];..    /* Se
1e550 74 20 75 70 20 61 20 53 72 63 4c 69 73 74 20 63  t up a SrcList c
1e560 6f 6e 74 61 69 6e 69 6e 67 20 6a 75 73 74 20 74  ontaining just t
1e570 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
1e580 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
1e590 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 6f 6e 65 54  oop. */.    oneT
1e5a0 61 62 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  ab.nSrc = 1;.   
1e5b0 20 6f 6e 65 54 61 62 2e 6e 41 6c 6c 6f 63 20 3d   oneTab.nAlloc =
1e5c0 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62 2e 61   1;.    oneTab.a
1e5d0 5b 30 5d 20 3d 20 2a 70 54 61 62 49 74 65 6d 3b  [0] = *pTabItem;
1e5e0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
1e5f0 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
1e600 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
1e610 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
1e620 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
1e630 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
1e640 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
1e650 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
1e660 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
1e670 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
1e680 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
1e690 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
1e6a0 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
1e6b0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
1e6c0 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
1e6d0 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
1e6e0 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
1e6f0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
1e700 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
1e710 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
1e720 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
1e730 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
1e740 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
1e750 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
1e760 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
1e770 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
1e780 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
1e790 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
1e7a0 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
1e7b0 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
1e7c0 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
1e7d0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
1e7e0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
1e7f0 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
1e800 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
1e810 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
1e820 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
1e830 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
1e840 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
1e850 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
1e860 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
1e870 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20      regRowset = 
1e880 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1e890 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d        regRowid =
1e8a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1e8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e8c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1e8d0 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65  ull, 0, regRowse
1e8e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52  t);.    }.    iR
1e8f0 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  etInit = sqlite3
1e900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e910 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
1e920 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f  Return);..    fo
1e930 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63  r(ii=0; ii<pOrWc
1e940 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a  ->nTerm; ii++){.
1e950 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1e960 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57  *pOrTerm = &pOrW
1e970 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20  c->a[ii];.      
1e980 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
1e990 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c  tCursor==iCur ||
1e9a0 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
1e9b0 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20  tor==WO_AND ){. 
1e9c0 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f         WhereInfo
1e9d0 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20   *pSubWInfo;    
1e9e0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f        /* Info fo
1e9f0 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d  r single OR-term
1ea00 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20   scan */.       
1ea10 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
1ea20 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74   table entries t
1ea30 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70  hat match term p
1ea40 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  OrTerm. */.     
1ea50 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73     pSubWInfo = s
1ea60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1ea70 28 70 50 61 72 73 65 2c 20 26 6f 6e 65 54 61 62  (pParse, &oneTab
1ea80 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
1ea90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
1eab0 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57  RE_OMIT_OPEN | W
1eac0 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20  HERE_OMIT_CLOSE 
1ead0 7c 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41  | WHERE_FORCE_TA
1eae0 42 4c 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  BLE);.        if
1eaf0 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20  ( pSubWInfo ){. 
1eb00 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63           if( (wc
1eb10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1eb20 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
1eb30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1eb40 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69    int iSet = ((i
1eb50 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  i==pOrWc->nTerm-
1eb60 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20  1)?-1:ii);.     
1eb70 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
1eb80 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71            r = sq
1eb90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1eba0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1ebb0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d  TabItem->pTab, -
1ebc0 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20  1, iCur, .      
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b     regRowid, 0);
1ec00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1ec10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1ec20 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65  t(v, OP_RowSetTe
1ec30 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20  st, regRowset,. 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1ec70 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20  ntAddr(v)+2, r, 
1ec80 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
1ec90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
1eca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ecb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
1ecc0 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79  eturn, iLoopBody
1ecd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
1ece0 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70   Finish the loop
1ecf0 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
1ed00 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
1ed10 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
1ed20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1ed30 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75  ite3WhereEnd(pSu
1ed40 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  bWInfo);.       
1ed50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ed60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ed70 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
1ed80 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
1ed90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
1eda0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1edb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1edc0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1edd0 73 65 74 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  set); */.    sql
1ede0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1edf0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
1ee00 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
1ee10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1ee20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1ee30 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
1ee40 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1ee50 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
1ee60 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
1ee70 72 6e 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  rn;.    disableT
1ee80 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
1ee90 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
1eea0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1eeb0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
1eec0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
1eed0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
1eee0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
1eef0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
1ef00 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
1ef10 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
1ef20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
1ef30 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
1ef40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1ef50 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
1ef60 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
1ef70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1ef80 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
1ef90 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
1efa0 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
1efb0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
1efc0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ev==1 );.    ass
1efd0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1efe0 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 );.    pLevel-
1eff0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
1f000 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
1f010 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1f020 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
1f030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f040 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
1f050 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1f060 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
1f070 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
1f080 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
1f090 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61  EP;.  }.  notRea
1f0a0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
1f0b0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
1f0c0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
1f0d0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
1f0e0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
1f0f0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
1f100 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
1f110 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
1f120 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
1f130 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
1f140 6b 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65  k = 0;.  for(pTe
1f150 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43  rm=pWC->a, j=pWC
1f160 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  ->nTerm; j>0; j-
1f170 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
1f180 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74   Expr *pE;.    t
1f190 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1f1a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1f1b0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65  IRTUAL );.    te
1f1c0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1f1d0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
1f1e0 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
1f1f0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1f200 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
1f210 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
1f220 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
1f230 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
1f240 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
1f250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1f260 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
1f270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1f280 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1f290 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1f2a0 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
1f2b0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1f2c0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63  Join) ){.      c
1f2d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1f2e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f2f0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1f300 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
1f310 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f320 20 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70      k = 1;.    p
1f330 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
1f340 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d   TERM_CODED;.  }
1f350 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46  ..  /* For a LEF
1f360 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65  T OUTER JOIN, ge
1f370 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1f380 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65   will record the
1f390 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20   fact that.  ** 
1f3a0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
1f3b0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
1f3c0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
1f3d0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
1f3e0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65   .  */.  if( pLe
1f3f0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
1f400 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64  {.    pLevel->ad
1f410 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
1f420 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1f430 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1f440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f450 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65  _Integer, 1, pLe
1f460 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
1f470 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1f480 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46  ((v, "record LEF
1f490 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
1f4a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f4b0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1f4c0 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  ;.    for(pTerm=
1f4d0 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70  pWC->a, j=0; j<p
1f4e0 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  WC->nTerm; j++, 
1f4f0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
1f500 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1f510 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1f520 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1f530 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1f540 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1f550 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20  _CODED );.      
1f560 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1f570 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
1f580 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
1f590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f5a0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1f5b0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
1f5c0 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
1f5d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f5e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
1f5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f600 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f610 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61   pTerm->pExpr, a
1f620 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
1f630 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f640 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
1f650 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
1f660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1f670 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f680 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65  eg(pParse, iRele
1f690 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75  aseReg);..  retu
1f6a0 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a  rn notReady;.}..
1f6b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1f6c0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
1f6d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1f6e0 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
1f6f0 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
1f700 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
1f710 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
1f720 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
1f730 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1f740 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
1f750 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
1f760 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
1f770 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
1f780 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1f790 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1f7a0 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
1f7b0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
1f7c0 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
1f7d0 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
1f7e0 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
1f7f0 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
1f800 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f820 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
1f830 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
1f840 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
1f850 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  LITE_TEST */.../
1f860 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
1f870 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
1f880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1f890 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
1f8a0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
1f8b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
1f8c0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
1f8d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1f8e0 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
1f8f0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
1f900 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
1f910 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
1f920 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
1f930 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
1f940 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
1f950 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e    /* assert( pIn
1f960 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1f970 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  xStr==0 || db->m
1f980 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a  allocFailed ); *
1f990 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
1f9a0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1f9b0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  dxStr ){.       
1f9c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f9d0 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  pInfo->idxStr);.
1f9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f9f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1fa00 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20  db, pInfo);.    
1fa10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
1fa20 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70  ereClauseClear(p
1fa30 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20  WInfo->pWC);.   
1fa40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1fa50 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
1fa60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1fa70 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
1fa80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
1fa90 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
1faa0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
1fab0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1fac0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
1fad0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
1fae0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
1faf0 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
1fb00 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
1fb10 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1fb20 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
1fb30 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
1fb40 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
1fb50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
1fb60 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
1fb70 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
1fb80 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
1fb90 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
1fba0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1fbb0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1fbc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1fbd0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
1fbe0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
1fbf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
1fc00 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
1fc10 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
1fc20 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
1fc30 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
1fc40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fc50 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
1fc60 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
1fc70 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
1fc80 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
1fc90 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
1fca0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
1fcb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1fcc0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
1fcd0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
1fce0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
1fcf0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1fd00 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
1fd10 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
1fd20 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
1fd30 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
1fd40 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
1fd50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1fd60 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
1fd70 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
1fd80 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
1fd90 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
1fda0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
1fdb0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
1fdc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1fdd0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
1fde0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
1fdf0 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
1fe00 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
1fe10 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
1fe40 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
1fe50 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
1fe60 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
1fe70 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1fe80 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
1feb0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
1fec0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
1fed0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
1fee0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
1fef0 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
1ff00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1ff10 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
1ff20 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
1ff30 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
1ff40 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
1ff50 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
1ff60 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
1ff70 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
1ff80 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ff90 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
1ffa0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
1ffb0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
1ffc0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
1ffd0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
1ffe0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
1fff0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
20000 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
20010 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
20020 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20030 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
20040 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
20050 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
20060 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
20070 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
20080 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
20090 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
200a0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
200b0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
200c0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
200d0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
200e0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
200f0 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
20100 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
20110 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
20120 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
20130 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
20140 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
20150 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
20160 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
20170 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
20180 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
20190 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
201a0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
201b0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
201c0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
201d0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
201e0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
201f0 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
20200 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
20210 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
20220 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
20230 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
20240 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
20250 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
20260 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
20270 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
20280 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
20290 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
202a0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
202b0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
202c0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
202d0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
202e0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
202f0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
20300 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
20310 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
20320 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
20330 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
20340 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
20350 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
20360 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
20370 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
20380 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
20390 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
203a0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
203b0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
203c0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
203d0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
203e0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
203f0 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
20400 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
20410 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
20420 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
20430 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
20440 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
20450 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
20460 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
20470 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
20480 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
20490 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
204a0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
204b0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
204c0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
204d0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
204e0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
204f0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
20500 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
20510 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
20520 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
20530 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
20540 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
20550 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
20560 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
20570 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
20580 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
20590 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
205a0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
205b0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
205c0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
205d0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
205e0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
205f0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
20600 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
20610 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
20620 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
20630 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
20640 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
20650 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
20660 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
20670 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
20680 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
20690 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
206a0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
206b0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
206c0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
206d0 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
206e0 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
206f0 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
20700 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
20710 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
20720 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
20730 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
20740 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20750 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
20760 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
20770 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
20780 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
20790 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
207a0 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
207b0 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
207c0 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
207d0 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
207e0 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
207f0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
20800 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
20810 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20820 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
20830 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
20840 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
20850 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
20860 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
20870 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
20880 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
20890 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
208a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
208b0 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
208c0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
208d0 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
208e0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
208f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
20900 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
20910 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
20920 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
20930 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
20940 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
20950 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
20960 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
20970 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
20980 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
20990 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
209a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
209b0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
209c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
209d0 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
209e0 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
209f0 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
20a00 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
20a10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
20a20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
20a30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
20a40 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f  OrderBy, /* An O
20a50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
20a60 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36  or NULL */.  u16
20a70 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
20a80 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
20a90 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
20aa0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
20ab0 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Int.h */.){.  in
20ac0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20ae0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
20af0 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
20b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
20b10 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
20b20 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
20b30 74 72 75 63 74 20 2a 2f 0a 20 20 57 68 65 72 65  truct */.  Where
20b40 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
20b50 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
20b60 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
20b70 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
20b80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
20b90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
20ba0 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
20bb0 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
20bc0 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61  ngine */.  Bitma
20bd0 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20  sk notReady;    
20be0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
20bf0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65   that are not ye
20c00 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a  t positioned */.
20c10 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a    WhereMaskSet *
20c20 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20  pMaskSet;    /* 
20c30 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
20c40 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
20c50 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c70 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
20c80 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
20c90 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
20ca0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
20cb0 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67  Item;  /* A sing
20cc0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54  le entry from pT
20cd0 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
20ce0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20d00 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
20d10 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74   the pWInfo list
20d20 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b   */.  int iFrom;
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
20d50 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
20d60 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
20d70 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
20d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
20d90 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
20da0 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e  of all pWC->a[].
20db0 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  wtFlags */.  sql
20dc0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
20dd0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
20de0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
20df0 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  /..  /* The numb
20e00 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
20e10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20e20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
20e30 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  e number of.  **
20e40 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61   bits in a Bitma
20e50 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk .  */.  if( p
20e60 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
20e70 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
20e80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20e90 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
20ea0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
20eb0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
20ec0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c   0;.  }..  /* Al
20ed0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
20ee0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
20ef0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
20f00 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
20f10 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
20f20 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
20f30 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
20f40 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
20f50 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
20f60 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
20f70 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
20f80 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
20f90 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
20fa0 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
20fb0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
20fc0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
20fd0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
20fe0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
20ff0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
21000 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
21010 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
21020 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
21030 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
21040 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
21050 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
21060 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
21070 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
21080 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
21090 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
210a0 29 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  )+(pTabList->nSr
210b0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  c-1)*sizeof(Wher
210c0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
210d0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
210e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
210f0 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b      nByteWInfo +
21100 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57   .      sizeof(W
21110 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20  hereClause) +.  
21120 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
21130 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20  MaskSet).  );.  
21140 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21150 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
21160 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
21170 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e  ;.  }.  pWInfo->
21180 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73  nLevel = pTabLis
21190 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66  t->nSrc;.  pWInf
211a0 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
211b0 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
211c0 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
211d0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
211e0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
211f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
21200 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70   pWInfo->pWC = p
21210 57 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73  WC = (WhereClaus
21220 65 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e  e *)&((u8 *)pWIn
21230 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b  fo)[nByteWInfo];
21240 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  .  pWInfo->wctrl
21250 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61  Flags = wctrlFla
21260 67 73 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  gs;.  pMaskSet =
21270 20 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29   (WhereMaskSet*)
21280 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53  &pWC[1];..  /* S
21290 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
212a0 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
212b0 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
212c0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
212d0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
212e0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
212f0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
21300 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
21310 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
21320 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
21330 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70  t(pWC, pParse, p
21340 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  MaskSet);.  sqli
21350 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
21360 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
21370 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
21380 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20  it(pWC, pWhere, 
21390 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
213a0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
213b0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
213c0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
213d0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
213e0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
213f0 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
21400 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
21410 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
21420 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
21430 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73  here && (pTabLis
21440 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71  t->nSrc==0 || sq
21450 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
21460 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
21470 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
21480 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
21490 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
214a0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
214b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
214c0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
214d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
214e0 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
214f0 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
21500 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
21510 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
21520 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
21530 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
21540 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
21550 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
21560 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
21570 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
21580 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
21590 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
215a0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
215b0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
215c0 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
215d0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
215e0 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
215f0 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
21600 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
21610 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
21620 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
21630 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
21640 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
21650 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21660 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
21670 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
21680 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
21690 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
216a0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
216b0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
216c0 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
216d0 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
216e0 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
216f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
21700 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
21710 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
21720 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
21730 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
21740 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
21750 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
21760 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
21770 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
21780 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 76  he WhereClause.v
21790 6d 61 73 6b 20 76 61 72 69 61 62 6c 65 20 73 6f  mask variable so
217a0 20 74 68 61 74 20 62 69 74 73 20 74 68 61 74 20   that bits that 
217b0 63 6f 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20  correspond.  ** 
217c0 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  to virtual table
217d0 20 63 75 72 73 6f 72 73 20 61 72 65 20 73 65 74   cursors are set
217e0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
217f0 6f 20 73 65 6c 65 63 74 69 76 65 6c 79 20 64 69  o selectively di
21800 73 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20  sable .  ** the 
21810 4f 52 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f  OR-to-IN transfo
21820 72 6d 61 74 69 6f 6e 20 69 6e 20 65 78 70 72 41  rmation in exprA
21830 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20  nalyzeOrTerm(). 
21840 49 74 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  It is not helpfu
21850 6c 20 0a 20 20 2a 2a 20 77 69 74 68 20 76 69 72  l .  ** with vir
21860 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a  tual tables..  *
21870 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d  /.  assert( pWC-
21880 3e 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61  >vmask==0 && pMa
21890 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  skSet->n==0 );. 
218a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
218b0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
218c0 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b  {.    createMask
218d0 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (pMaskSet, pTabL
218e0 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
218f0 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
21900 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
21910 41 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57  ABLE.    if( ALW
21920 41 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  AYS(pTabList->a[
21930 69 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69  i].pTab) && IsVi
21940 72 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e  rtual(pTabList->
21950 61 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[i].pTab) ){.  
21960 20 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c      pWC->vmask |
21970 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c  = ((Bitmask)1 <<
21980 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
21990 66 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  f.  }.#ifndef ND
219a0 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74  EBUG.  {.    Bit
219b0 6d 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d  mask toTheLeft =
219c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
219d0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
219e0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  c; i++){.      B
219f0 69 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61  itmask m = getMa
21a00 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
21a10 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
21a20 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
21a30 72 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65  rt( (m-1)==toThe
21a40 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f  Left );.      to
21a50 54 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20  TheLeft |= m;.  
21a60 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
21a70 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
21a80 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
21a90 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
21aa0 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
21ab0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
21ac0 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
21ad0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
21ae0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
21af0 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
21b00 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
21b10 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
21b20 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
21b30 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
21b40 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
21b50 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
21b60 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
21b70 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
21b80 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
21b90 2e 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61  ..  */.  exprAna
21ba0 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74  lyzeAll(pTabList
21bb0 2c 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62  , pWC);.  if( db
21bc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
21bd0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
21be0 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a  BeginError;.  }.
21bf0 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20  .  /* Chose the 
21c00 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
21c10 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
21c20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
21c30 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
21c40 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69  his loop fills i
21c50 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
21c60 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a  fields:.  **.  *
21c70 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
21c80 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e  pIdx      The in
21c90 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
21ca0 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  his level of the
21cb0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57   loop..  **   pW
21cc0 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67  Info->a[].wsFlag
21cd0 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c  s   WHERE_xxx fl
21ce0 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
21cf0 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20  ith pIdx.  **   
21d00 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20  pWInfo->a[].nEq 
21d10 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72        The number
21d20 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f   of == and IN co
21d30 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20  nstraints.  **  
21d40 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72   pWInfo->a[].iFr
21d50 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72  om     Which ter
21d60 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
21d70 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
21d80 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
21d90 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
21da0 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
21db0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
21dc0 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
21dd0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
21de0 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
21df0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
21e00 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ex.  **   pWInfo
21e10 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20  ->a[].pTerm     
21e20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f  When wsFlags==WO
21e30 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75  _OR, the OR-clau
21e40 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a  se term.  **.  *
21e50 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
21e60 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
21e70 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
21e80 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
21e90 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
21ea0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
21eb0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
21ec0 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54  .  pTabItem = pT
21ed0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65  abList->a;.  pLe
21ee0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
21ef0 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30  .  andFlags = ~0
21f00 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
21f10 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
21f20 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
21f30 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
21f40 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
21f50 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
21f60 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
21f70 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73  +){.    WhereCos
21f80 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20  t bestPlan;     
21f90 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69      /* Most effi
21fa0 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20  cient plan seen 
21fb0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e  so far */.    In
21fc0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
21fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
21fe0 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c  ex for FROM tabl
21ff0 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f  e at pTabItem */
22000 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
22030 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73  over FROM tables
22040 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
22050 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  J = -1;         
22060 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
22070 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74   of j */.    Bit
22080 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20  mask m;         
22090 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
220a0 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20  ask value for j 
220b0 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20  or bestJ */.    
220c0 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20  int isOptimal;  
220d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
220e0 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69  terator for opti
220f0 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20  mal/non-optimal 
22100 73 65 61 72 63 68 20 2a 2f 0a 0a 20 20 20 20 6d  search */..    m
22110 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
22120 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
22130 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
22140 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
22150 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 20  TE_BIG_DBL;..   
22160 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
22170 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65   the remaining e
22180 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ntries in the FR
22190 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e  OM clause to fin
221a0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  d the.    ** nex
221b0 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54  t nested loop. T
221c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  he FROM clause e
221d0 6e 74 72 69 65 73 20 6d 61 79 20 62 65 20 69 74  ntries may be it
221e0 65 72 61 74 65 64 20 74 68 72 6f 75 67 68 0a 20  erated through. 
221f0 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63     ** either onc
22200 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20  e or twice. .   
22210 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
22220 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2c 20  irst iteration, 
22230 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20  which is always 
22240 70 65 72 66 6f 72 6d 65 64 2c 20 73 65 61 72 63  performed, searc
22250 68 65 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20  hes for the.    
22260 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
22270 6e 74 72 79 20 74 68 61 74 20 70 65 72 6d 69 74  ntry that permit
22280 73 20 74 68 65 20 6c 6f 77 65 73 74 2d 63 6f 73  s the lowest-cos
22290 74 2c 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61  t, "optimal" sca
222a0 6e 2e 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69  n. In.    ** thi
222b0 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74  s context an opt
222c0 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65  imal scan is one
222d0 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
222e0 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20  ame strategy.   
222f0 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65   ** for the give
22300 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  n FROM clause en
22310 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20  try as would be 
22320 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20  selected if the 
22330 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72  entry.    ** wer
22340 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e  e used as the in
22350 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c  nermost nested l
22360 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  oop.  In other w
22370 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20  ords, a table.  
22380 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73    ** is chosen s
22390 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73  uch that the cos
223a0 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61  t of running tha
223b0 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  t table cannot b
223c0 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a  e reduced.    **
223d0 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20   by waiting for 
223e0 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
223f0 72 75 6e 20 66 69 72 73 74 2e 0a 20 20 20 20 2a  run first..    *
22400 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
22410 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 69 73  ond iteration is
22420 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20   only performed 
22430 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63  if no optimal sc
22440 61 6e 20 73 74 72 61 74 65 67 69 65 73 0a 20 20  an strategies.  
22450 20 20 2a 2a 20 77 65 72 65 20 66 6f 75 6e 64 20    ** were found 
22460 62 79 20 74 68 65 20 66 69 72 73 74 2e 20 54 68  by the first. Th
22470 69 73 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  is iteration is 
22480 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66  used to search f
22490 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f  or the.    ** lo
224a0 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f  west cost scan o
224b0 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20  verall..    **. 
224c0 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76     ** Previous v
224d0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
224e0 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79  e performed only
224f0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
22500 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74  ation -.    ** t
22510 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73  he next outermos
22520 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79  t loop was alway
22530 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  s that with the 
22540 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20  lowest overall. 
22550 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65     ** cost. Howe
22560 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20  ver, this meant 
22570 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c  that SQLite coul
22580 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f  d select the wro
22590 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66  ng plan.    ** f
225a0 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20  or scripts such 
225b0 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
225c0 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20  :.    **   .    
225d0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
225e0 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20  E t1(a, b); .   
225f0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
22600 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20  LE t2(c, d);.   
22610 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
22620 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45  ROM t2, t1 WHERE
22630 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61   t2.rowid = t1.a
22640 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
22650 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67  The best strateg
22660 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20  y is to iterate 
22670 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
22680 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20   first. However 
22690 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
226a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
226b0 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68  ermine this with
226c0 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
226d0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
226e0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  ** However, sinc
226f0 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
22700 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
22710 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20  ugh table t2 is 
22720 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a  the same .    **
22730 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20   as the cost of 
22740 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
22750 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20  rough table t1, 
22760 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
22770 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68  .    ** algorith
22780 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  m may choose to 
22790 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f  use t2 for the o
227a0 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68  uter loop, which
227b0 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a   is a much.    *
227c0 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f  * costlier appro
227d0 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ach..    */.    
227e0 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 31 3b  for(isOptimal=1;
227f0 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
22800 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
22810 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  mal--){.      Bi
22820 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 28 69 73  tmask mask = (is
22830 4f 70 74 69 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f  Optimal ? 0 : no
22840 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 61  tReady);.      a
22850 73 73 65 72 74 28 20 28 70 54 61 62 4c 69 73 74  ssert( (pTabList
22860 2d 3e 6e 53 72 63 2d 69 46 72 6f 6d 29 3e 31 20  ->nSrc-iFrom)>1 
22870 7c 7c 20 69 73 4f 70 74 69 6d 61 6c 20 29 3b 0a  || isOptimal );.
22880 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f        for(j=iFro
22890 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61  m, pTabItem=&pTa
228a0 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70  bList->a[j]; j<p
228b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a  TabList->nSrc; j
228c0 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b  ++, pTabItem++){
228d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  .        int doN
228e0 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a  otReorder;    /*
228f0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61   True if this ta
22900 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ble should not b
22910 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20  e reordered */. 
22920 20 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74         WhereCost
22930 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43   sCost;     /* C
22940 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ost information 
22950 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61  from best[Virtua
22960 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20  l]Index() */.   
22970 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
22980 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44  OrderBy;  /* ORD
22990 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
229a0 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69   index to optimi
229b0 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20  ze */.  .       
229c0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20   doNotReorder = 
229d0 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e   (pTabItem->join
229e0 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
229f0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20  JT_CROSS))!=0;. 
22a00 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46         if( j!=iF
22a10 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72  rom && doNotReor
22a20 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
22a30 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
22a40 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (pMaskSet, pTabI
22a50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
22a60 20 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20         if( (m & 
22a70 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
22a80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
22a90 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b  =iFrom ) iFrom++
22aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
22ab0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
22ac0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
22ad0 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f   = ((i==0 && ppO
22ae0 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65  rderBy )?*ppOrde
22af0 72 42 79 3a 30 29 3b 0a 20 20 0a 20 20 20 20 20  rBy:0);.  .     
22b00 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
22b10 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66  tem->pTab );.#if
22b20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22b30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
22b40 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
22b50 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54  ual(pTabItem->pT
22b60 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
22b70 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
22b80 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e  nfo **pp = &pWIn
22b90 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66  fo->a[j].pIdxInf
22ba0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  o;.          bes
22bb0 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
22bc0 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49  arse, pWC, pTabI
22bd0 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65  tem, mask, pOrde
22be0 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70 29  rBy, &sCost, pp)
22bf0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22c00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
22c10 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  {.          best
22c20 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73  BtreeIndex(pPars
22c30 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d  e, pWC, pTabItem
22c40 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42 79  , mask, pOrderBy
22c50 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20  , &sCost);.     
22c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
22c70 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c  ert( isOptimal |
22c80 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f  | (sCost.used&no
22c90 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20  tReady)==0 );.. 
22ca0 20 20 20 20 20 20 20 69 66 28 20 28 73 43 6f 73         if( (sCos
22cb0 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29  t.used&notReady)
22cc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
22cd0 28 6a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 73 43 6f  (j==iFrom || sCo
22ce0 73 74 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61  st.rCost<bestPla
22cf0 6e 2e 72 43 6f 73 74 29 20 0a 20 20 20 20 20 20  n.rCost) .      
22d00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62    ){.          b
22d10 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b  estPlan = sCost;
22d20 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a  .          bestJ
22d30 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
22d40 20 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f          if( doNo
22d50 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
22d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22d70 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
22d80 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  J>=0 );.    asse
22d90 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67  rt( notReady & g
22da0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
22db0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
22dc0 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a  tJ].iCursor) );.
22dd0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
22de0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73  "*** Optimizer s
22df0 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20  elects table %d 
22e00 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20  for loop %d\n", 
22e10 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20  bestJ,.         
22e20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d    pLevel-pWInfo-
22e30 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62  >a));.    if( (b
22e40 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
22e50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
22e60 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
22e70 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
22e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
22e90 6c 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e  lags &= bestPlan
22ea0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20  .plan.wsFlags;. 
22eb0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20     pLevel->plan 
22ec0 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b  = bestPlan.plan;
22ed0 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
22ee0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
22ef0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
22f00 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
22f10 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
22f20 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
22f30 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
22f40 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
22f50 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
22f60 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
22f70 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
22f80 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
22f90 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
22fa0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62  l->iFrom = (u8)b
22fb0 65 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  estJ;..    /* Ch
22fc0 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20  eck that if the 
22fd0 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79  table scanned by
22fe0 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61   this loop itera
22ff0 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20  tion had an.    
23000 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
23010 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f  ause attached to
23020 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61   it, that the na
23030 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69  med index is bei
23040 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66  ng.    ** used f
23050 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20  or the scan. If 
23060 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20  not, then query 
23070 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20  compilation has 
23080 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52  failed..    ** R
23090 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  eturn an error..
230a0 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20      */.    pIdx 
230b0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65  = pTabList->a[be
230c0 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20  stJ].pIndex;.   
230d0 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
230e0 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
230f0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
23100 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
23110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23120 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23130 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65  rse, "cannot use
23140 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64   index: %s", pId
23150 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
23160 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
23170 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  inError;.      }
23180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23190 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
231a0 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64  Y clause is used
231b0 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  , the bestIndex(
231c0 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
231d0 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
231e0 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  eed to find the 
231f0 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20  index specified 
23200 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  in the INDEXED B
23210 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  Y clause.       
23220 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61   ** if it find a
23230 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20  n index at all. 
23240 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
23250 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  t( bestPlan.plan
23260 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b  .u.pIdx==pIdx );
23270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23280 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
23290 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
232a0 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
232b0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
232c0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
232d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
232e0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
232f0 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Error;.  }..  /*
23300 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
23310 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
23320 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
23330 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
23340 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
23350 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
23360 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
23370 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
23380 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
23390 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
233a0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
233b0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
233c0 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
233d0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
233e0 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
233f0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
23400 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
23410 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
23420 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
23430 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65  priate..  ** The
23440 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
23450 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  thm only works i
23460 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
23470 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
23480 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
23490 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69  t to update a si
234a0 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20  ngle row..  */. 
234b0 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
234c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
234d0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
234e0 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
234f0 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
23500 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
23510 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
23520 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c  ED)!=0 && (andFl
23530 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
23540 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  UE)!=0 ){.    pW
23550 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
23560 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
23570 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[0].plan.wsFla
23580 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
23590 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
235a0 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
235b0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
235c0 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
235d0 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
235e0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
235f0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
23600 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
23610 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
23620 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
23630 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
23640 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66  fier Goto */.  f
23650 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
23660 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
23670 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
23680 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
23690 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
236a0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
236b0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
236c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
236d0 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
236e0 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
236f0 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65  index */..#ifnde
23700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
23710 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50  PLAIN.    if( pP
23720 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
23730 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
23740 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75  zMsg;.      stru
23750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23760 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
23770 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
23780 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67  rom];.      zMsg
23790 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
237a0 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22  f(db, "TABLE %s"
237b0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
237c0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
237d0 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
237e0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
237f0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
23800 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
23810 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
23820 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
23830 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
23840 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
23850 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
23860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  =0 ){.        zM
23870 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
23880 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
23890 25 73 20 57 49 54 48 20 49 4e 44 45 58 20 25 73  %s WITH INDEX %s
238a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d  ",.           zM
238b0 73 67 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  sg, pLevel->plan
238c0 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  .u.pIdx->zName);
238d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
238e0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
238f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
23900 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
23910 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23920 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
23930 67 2c 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49  g, "%s VIA MULTI
23940 2d 49 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a  -INDEX UNION", z
23950 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
23960 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  e if( pLevel->pl
23970 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
23980 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
23990 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
239a0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
239b0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
239c0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
239d0 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45  USING PRIMARY KE
239e0 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
239f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
23a00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
23a10 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69  BLE.      else i
23a20 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
23a30 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
23a40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
23a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23a60 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
23a70 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
23a80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
23a90 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Idx;.        zMs
23aa0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23ab0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
23ac0 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  s VIRTUAL TABLE 
23ad0 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d  INDEX %d:%s", zM
23ae0 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
23af0 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
23b00 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49  ->idxNum, pVtabI
23b10 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  dx->idxStr);.   
23b20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23b30 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
23b40 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
23b50 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20  RE_ORDERBY ){.  
23b60 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
23b70 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
23b80 20 7a 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52   zMsg, "%s ORDER
23b90 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20   BY", zMsg);.   
23ba0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
23bb0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
23bc0 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70  OP_Explain, i, p
23bd0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c  Level->iFrom, 0,
23be0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
23bf0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
23c00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23c10 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70  EXPLAIN */.    p
23c20 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
23c30 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
23c40 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
23c50 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
23c60 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
23c70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
23c80 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
23c90 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  ma);.    if( (pT
23ca0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
23cb0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
23cc0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
23cd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
23ce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23cf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
23d00 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
23d10 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
23d20 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
23d30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
23d40 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
23d50 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
23d60 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
23d70 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
23d80 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
23d90 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
23da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23db0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
23dc0 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
23dd0 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
23de0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
23df0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
23e00 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
23e10 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
23e20 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  Y)==0.         &
23e30 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
23e40 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29  WHERE_OMIT_OPEN)
23e50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23e60 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b   op = pWInfo->ok
23e70 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65  OnePass ? OP_Ope
23e80 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e  nWrite : OP_Open
23e90 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  Read;.      sqli
23ea0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
23eb0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
23ec0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
23ed0 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  b, op);.      if
23ee0 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
23ef0 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43  Pass && pTab->nC
23f00 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20  ol<BMS ){.      
23f10 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
23f20 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
23f30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
23f40 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
23f50 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
23f60 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
23f70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
23f80 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
23f90 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
23fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
23fc0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
23fd0 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
23fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c        assert( n<
23ff0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  =pTab->nCol );. 
24000 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
24010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
24020 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
24030 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
24040 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
24050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
24060 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70  vel->iTabCur = p
24070 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
24080 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
24090 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
240a0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
240b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  !=0 ){.      Ind
240c0 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c  ex *pIx = pLevel
240d0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
240e0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
240f0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
24100 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
24110 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74   pIx);.      int
24120 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
24130 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
24140 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
24150 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
24160 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
24170 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d  ssert( iIdxCur>=
24180 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
24190 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
241a0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
241b0 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
241c0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
241e0 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
241f0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
24200 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
24210 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
24220 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
24230 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
24240 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
24250 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
24260 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
24270 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24280 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
24290 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
242a0 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
242b0 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
242c0 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
242d0 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
242e0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
242f0 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
24300 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
24310 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
24320 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
24330 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
24340 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
24350 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
24360 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  .    notReady = 
24370 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
24380 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72  (pWInfo, i, wctr
24390 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79  lFlags, notReady
243a0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
243b0 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e 66  Continue = pWInf
243c0 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e 74  o->a[i].addrCont
243d0 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
243e0 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f  LITE_TEST  /* Fo
243f0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
24400 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79  bugging use only
24410 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20   */.  /* Record 
24420 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  in the query pla
24430 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
24440 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  out the current 
24450 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74  table.  ** and t
24460 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  he index used to
24470 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61   access it (if a
24480 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62  ny).  If the tab
24490 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  le itself.  ** i
244a0 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20  s not used, its 
244b0 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d  name is just '{}
244c0 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20  '.  If no index 
244d0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65  is used.  ** the
244e0 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64   index is listed
244f0 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68   as "{}".  If th
24500 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
24510 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69   used the.  ** i
24520 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27  ndex name is '*'
24530 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
24540 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24550 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rc; i++){.    ch
24560 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e  ar *z;.    int n
24570 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  ;.    pLevel = &
24580 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
24590 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
245a0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
245b0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20  ->iFrom];.    z 
245c0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69  = pTabItem->zAli
245d0 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  as;.    if( z==0
245e0 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d   ) z = pTabItem-
245f0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  >pTab->zName;.  
24600 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
24610 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
24620 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
24630 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
24640 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
24650 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24660 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
24670 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
24680 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
24690 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
246a0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
246b0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 6e  ", 2);.        n
246c0 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
246d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
246e0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
246f0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
24700 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  an], z, n);.    
24710 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
24720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24730 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
24740 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20  n[nQPlan++] = ' 
24750 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  ';.    }.    tes
24760 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
24770 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
24780 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
24790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
247a0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
247b0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
247c0 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69 66  _RANGE );.    if
247d0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
247e0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
247f0 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
24800 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
24810 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
24820 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
24830 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
24840 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
24850 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
24860 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
24870 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
24880 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
24890 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
248a0 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76 65  e3Strlen30(pLeve
248b0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
248c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
248d0 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
248e0 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
248f0 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20  y_plan)-2 ){.   
24900 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
24910 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
24920 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d  nQPlan], pLevel-
24930 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
24940 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
24950 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
24960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
24970 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
24980 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
24990 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
249a0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
249b0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
249c0 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29  Plan], "{} ", 3)
249d0 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b  ;.      nQPlan +
249e0 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
249f0 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
24a00 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
24a10 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
24a20 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
24a30 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
24a40 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
24a50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
24a60 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
24a70 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
24a80 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
24a90 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
24aa0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
24ab0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
24ac0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
24ad0 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
24ae0 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
24af0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
24b00 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
24b10 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
24b20 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 57    */.  return pW
24b30 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
24b40 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
24b50 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
24b60 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65 72  ginError:.  wher
24b70 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
24b80 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  Info);.  return 
24b90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
24ba0 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  rate the end of 
24bb0 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
24bc0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
24bd0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72   .** sqlite3Wher
24be0 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64  eBegin() for add
24bf0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
24c00 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
24c10 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68 65  ite3WhereEnd(Whe
24c20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
24c30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24c40 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
24c50 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  e;.  Vdbe *v = p
24c60 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
24c70 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
24c80 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
24c90 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
24ca0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
24cb0 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
24cc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24cd0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
24ce0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
24cf0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71   code..  */.  sq
24d00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
24d10 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
24d20 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
24d30 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
24d40 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
24d50 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
24d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24d70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
24d80 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
24d90 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
24da0 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
24db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24dc0 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65  eAddOp2(v, pLeve
24dd0 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->op, pLevel->p
24de0 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a  1, pLevel->p2);.
24df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24e00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65  eChangeP5(v, pLe
24e10 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a  vel->p5);.    }.
24e20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24e30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
24e40 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20  HERE_IN_ABLE && 
24e50 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
24e60 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  >0 ){.      stru
24e70 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
24e80 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
24e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
24ea0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
24eb0 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a  evel->addrNxt);.
24ec0 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
24ed0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49  el->u.in.nIn, pI
24ee0 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  n=&pLevel->u.in.
24ef0 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e  aInLoop[j-1]; j>
24f00 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a  0; j--, pIn--){.
24f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24f20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
24f30 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29  In->addrInTop+1)
24f40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24f50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24f60 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75  P_Next, pIn->iCu
24f70 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
24f80 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
24f90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
24fa0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
24fb0 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p-1);.      }.  
24fc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24fd0 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e  e(db, pLevel->u.
24fe0 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20  in.aInLoop);.   
24ff0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
25000 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
25010 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
25020 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
25030 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
25040 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
25050 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
25060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
25070 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65  v, OP_IfPos, pLe
25080 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
25090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
250a0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
250b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
250c0 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20  _ONLY)==0.      
250d0 20 20 20 20 20 7c 7c 20 28 70 4c 65 76 65 6c 2d       || (pLevel-
250e0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
250f0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
25100 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
25110 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25120 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
25130 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
25140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25150 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
25160 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
25170 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
25180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25190 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
251a0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
251b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
251c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
251d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
251e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
251f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d  if( pLevel->op==
25200 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20  OP_Return ){.   
25210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25220 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
25230 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  ub, pLevel->p1, 
25240 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73  pLevel->addrFirs
25250 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
25260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25280 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
25290 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
252a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
252b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
252c0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
252d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
252e0 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
252f0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
25300 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
25310 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
25320 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
25330 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
25340 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
25350 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
25360 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
25370 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
25380 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
25390 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
253a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
253b0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
253c0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
253d0 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
253e0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
253f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
25400 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
25410 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
25420 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
25430 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
25440 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
25450 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
25460 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
25470 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
25480 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62  eral)!=0 || pTab
25490 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
254a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
254b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
254c0 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43  s & WHERE_OMIT_C
254d0 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LOSE)==0 ){.    
254e0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
254f0 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65  kOnePass && (pLe
25500 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
25510 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
25520 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
25530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25540 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
25550 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
25560 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
25570 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
25580 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
25590 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
255a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
255b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
255c0 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65   OP_Close, pLeve
255d0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
255e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
255f0 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
25600 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
25610 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
25620 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
25630 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
25640 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
25650 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
25660 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
25670 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
25680 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
25690 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
256a0 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
256b0 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
256c0 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
256d0 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
256e0 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
256f0 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
25700 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
25710 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
25720 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
25730 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
25740 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
25750 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
25760 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
25770 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
25780 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
25790 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
257a0 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
257b0 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
257c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
257d0 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
257e0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
257f0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
25800 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
25810 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
25820 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
25830 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
25840 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
25850 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
25860 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
25870 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
25880 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
25890 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
258a0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
258b0 2f 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  /.    if( (pLeve
258c0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
258d0 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
258e0 21 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  !=0 && !db->mall
258f0 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20 20 20 20  ocFailed){.     
25900 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b   int k, j, last;
25910 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
25920 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  Op;.      Index 
25930 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
25940 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20  plan.u.pIdx;..  
25950 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
25960 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  !=0 );.      pOp
25970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
25980 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  tOp(v, pWInfo->i
25990 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74  Top);.      last
259a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
259b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
259c0 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f      for(k=pWInfo
259d0 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20  ->iTop; k<last; 
259e0 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
259f0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
25a00 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
25a10 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
25a20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
25a30 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
25a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
25a50 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
25a60 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
25a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
25a80 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43  p->p2==pIdx->aiC
25a90 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20  olumn[j] ){.    
25aa0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
25ab0 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  2 = j;.         
25ac0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
25ad0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
25af0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
25b00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
25b10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25b20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
25b30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25b40 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
25b50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c             || j<
25b60 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  pIdx->nColumn );
25b70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
25b80 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
25b90 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
25ba0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
25bb0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
25bc0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
25bd0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
25be0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
25bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25c00 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
25c10 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65  eanup.  */.  whe
25c20 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
25c30 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
25c40 3b 0a 7d 0a                                      ;.}.