/ Hex Artifact Content
Login

Artifact f20ee9a15c1ccb8b94cd31e3f8c6868e1358fc07:


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 73  nstraint;..    s
1a650 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1a660 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1a670 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47   iReg = sqlite3G
1a680 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1a690 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  se, nConstraint+
1a6a0 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b  2);.    for(j=1;
1a6b0 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b   j<=nConstraint;
1a6c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
1a6d0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
1a6e0 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
1a6f0 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d     if( aUsage[k]
1a700 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b  .argvIndex==j ){
1a710 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1a720 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
1a730 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[k].iTermOffse
1a740 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
1a750 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1a760 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72  rse, pWC->a[iTer
1a770 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m].pExpr->pRight
1a780 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20  , iReg+j+1);.   
1a790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a7b0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f        if( k==nCo
1a7c0 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b  nstraint ) break
1a7d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a7e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a7f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74   OP_Integer, pVt
1a800 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69  abIdx->idxNum, i
1a810 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1a820 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a830 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20  P_Integer, j-1, 
1a840 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c  iReg+1);.    sql
1a850 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a860 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
1a870 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65  ur, addrBrk, iRe
1a880 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  g, pVtabIdx->idx
1a890 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1a8a0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
1a8b0 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
1a8c0 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e  dxStr ? P4_MPRIN
1a8d0 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b  TF : P4_STATIC);
1a8e0 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e  .    pVtabIdx->n
1a8f0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1a900 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1a910 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1a920 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a930 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
1a940 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1a950 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
1a960 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
1a970 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  t;.        disab
1a980 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26  leTerm(pLevel, &
1a990 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a  pWC->a[iTerm]);.
1a9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a9b0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1a9c0 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  P_VNext;.    pLe
1a9d0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
1a9e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
1a9f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1aa00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1aa10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1aa20 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1aa30 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  iReg, nConstrain
1aa40 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t+2);.    sqlite
1aa50 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1aa60 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  arse, 1);.  }els
1aa70 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1aa80 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1aa90 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ABLE */..  if( p
1aaa0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1aab0 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
1aac0 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43  D_EQ ){.    /* C
1aad0 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64  ase 1:  We can d
1aae0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1aaf0 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1ab00 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1ab10 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1ab20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ab30 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1ab40 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1ab50 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1ab60 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1ab70 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1ab80 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1ab90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1aba0 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1abb0 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
1abc0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1abd0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1abe0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
1abf0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
1ac00 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
1ac10 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61  WO_IN, 0);.    a
1ac20 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
1ac30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ac40 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
1ac50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1ac60 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
1ac70 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73  =iCur );.    ass
1ac80 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1ac90 30 20 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52  0 );.    iRowidR
1aca0 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
1acb0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
1acc0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65  erm, pLevel, iRe
1acd0 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
1ace0 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
1acf0 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
1ad00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ad10 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
1ad20 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
1ad30 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
1ad40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ad50 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
1ad60 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
1ad70 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
1ad80 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1ad90 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1ada0 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1adb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1adc0 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1add0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1ade0 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Noop;.  }else if
1adf0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1ae00 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
1ae10 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
1ae20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65    /* Case 2:  We
1ae30 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c   have an inequal
1ae40 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
1ae50 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
1ae60 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20   field..    */. 
1ae70 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
1ae80 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  OP_Noop;.    int
1ae90 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20   start;.    int 
1aea0 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b  memEndValue = 0;
1aeb0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1aec0 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
1aed0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1aee0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1aef0 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
1af00 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
1af10 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
1af20 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
1af30 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
1af40 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
1af50 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
1af60 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  O_LE, 0);.    if
1af70 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
1af80 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
1af90 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
1afa0 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20  End;.      pEnd 
1afb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  = pTerm;.    }. 
1afc0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1afd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aff0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1b000 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1b010 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20  start bound */. 
1b020 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65       int r1, rTe
1b030 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  mp;        /* Re
1b040 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64  gisters for hold
1b050 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f  ing the start bo
1b060 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20  undary */..     
1b070 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1b080 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20  g constant maps 
1b090 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f  TK_xx codes into
1b0a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a   corresponding .
1b0b0 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70        ** seek op
1b0c0 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e  codes.  It depen
1b0d0 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  ds on a particul
1b0e0 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54  ar ordering of T
1b0f0 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K_xx.      */.  
1b100 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f      const u8 aMo
1b110 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  veOp[] = {.     
1b120 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a        /* TK_GT *
1b130 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20  /  OP_SeekGt,.  
1b140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c           /* TK_L
1b150 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c  E */  OP_SeekLe,
1b160 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  .           /* T
1b170 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b  K_LT */  OP_Seek
1b180 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f  Lt,.           /
1b190 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53  * TK_GE */  OP_S
1b1a0 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20  eekGe.      };. 
1b1b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1b1c0 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20  LE==TK_GT+1 );  
1b1d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
1b1e0 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20   the ordering.. 
1b1f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b200 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
1b210 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1b220 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c  of the TK_xx val
1b230 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  ues... */.      
1b240 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
1b250 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f  K_GT+3 );      /
1b260 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63  *  ... is correc
1b270 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58  ct. */..      pX
1b280 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1b290 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b2a0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
1b2b0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
1b2c0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1b2d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1b2e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1b2f0 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
1b300 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20  ight, &rTemp);. 
1b310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b320 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f  AddOp3(v, aMoveO
1b330 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c  p[pX->op-TK_GT],
1b340 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
1b350 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1b360 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1b370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b380 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1b390 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1b3a0 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  r1, 1);.      sq
1b3b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b3c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d  Reg(pParse, rTem
1b3d0 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  p);.      disabl
1b3e0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53  eTerm(pLevel, pS
1b3f0 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tart);.    }else
1b400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b410 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1b420 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1b430 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61  _Rewind, iCur, a
1b440 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  ddrBrk);.    }. 
1b450 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1b460 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1b470 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1b480 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1b490 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1b4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
1b4b0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1b4c0 75 72 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  ur );.      memE
1b4d0 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1b4e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1b4f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1b500 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1b510 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1b520 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1b530 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1b540 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1b550 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1b560 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1b570 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1b580 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1b590 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1b5a0 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1b5b0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1b5c0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1b5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1b5e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1b5f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1b600 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1b610 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1b620 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1b630 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1b640 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1b650 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 70 4c 65  = start;.    pLe
1b660 76 65 6c 2d 3e 70 35 20 3d 20 28 70 53 74 61 72  vel->p5 = (pStar
1b670 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 29  t==0 && pEnd==0)
1b680 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 74   ?1:0;.    if( t
1b690 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
1b6a0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
1b6b0 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
1b6c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1b6d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1b6e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b6f0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
1b700 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
1b710 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1b720 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
1b730 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
1b740 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1b750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b760 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
1b770 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
1b780 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
1b790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b7a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1b7b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
1b7c0 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
1b7d0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
1b7e0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
1b7f0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1b800 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
1b810 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
1b820 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
1b830 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
1b840 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
1b850 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b860 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
1b870 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
1b880 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
1b890 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
1b8a0 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
1b8b0 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
1b8c0 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
1b8d0 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
1b8e0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
1b8f0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
1b900 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
1b910 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
1b920 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1b930 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b940 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
1b950 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
1b960 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
1b970 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
1b980 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1b990 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
1b9a0 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
1b9b0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
1b9c0 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
1b9d0 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
1b9e0 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
1b9f0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
1ba00 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
1ba10 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
1ba20 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
1ba30 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
1ba40 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
1ba50 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
1ba60 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1ba70 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
1ba80 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
1ba90 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
1baa0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1bab0 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1bad0 41 4e 44 20 79 3d 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 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1bb00 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1bb10 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
1bb20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1bb30 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
1bb40 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
1bb50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
1bb60 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
1bb70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
1bb80 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
1bb90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bba0 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
1bbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1bbc0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
1bbd0 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
1bbe0 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
1bbf0 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
1bc00 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
1bc10 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
1bc20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
1bc30 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
1bc40 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1bc50 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
1bc60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bc70 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
1bc80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1bc90 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
1bca0 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
1bcb0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
1bcc0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
1bcd0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
1bce0 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
1bcf0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
1bd00 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
1bd10 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
1bd20 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
1bd30 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
1bd40 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
1bd50 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74      */  .    int
1bd60 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
1bd70 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
1bd80 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
1bd90 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1bda0 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
1bdb0 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1bdc0 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
1bdd0 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
1bde0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1bdf0 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1be00 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1be10 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
1be20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
1be30 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
1be40 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1be50 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1be60 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1be70 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
1be80 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
1be90 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1bea0 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1beb0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1bec0 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
1bed0 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
1bee0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1bef0 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
1bf00 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1bf10 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
1bf20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
1bf30 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1bf40 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
1bf50 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1bf60 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20   int aEndOp[] = 
1bf70 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c  {.      OP_Noop,
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf90 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61  0: (!end_constra
1bfa0 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f  ints) */.      O
1bfb0 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20  P_IdxGE,        
1bfc0 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63      /* 1: (end_c
1bfd0 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62  onstraints && !b
1bfe0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1bff0 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20  _IdxLT          
1c000 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
1c010 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65  nstraints && bRe
1c020 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1c030 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
1c040 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20  l->plan.nEq;.   
1c050 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
1c060 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1c070 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
1c080 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
1c090 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
1c0a0 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c0c0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1c0d0 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1c0e0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
1c0f0 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
1c100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c110 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
1c120 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1c130 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
1c140 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1c150 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1c160 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
1c170 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1c180 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
1c190 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1c1a0 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
1c1b0 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
1c1c0 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
1c1d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c1e0 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
1c1f0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1c200 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
1c210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c220 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1c230 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
1c240 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1c250 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
1c260 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
1c270 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
1c280 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1c290 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
1c2a0 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1c2b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c2c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1c2d0 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
1c2e0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
1c2f0 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
1c300 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
1c310 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
1c320 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1c330 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1c340 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
1c350 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
1c360 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
1c370 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
1c380 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
1c390 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1c3a0 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
1c3b0 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
1c3c0 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 0a 0a 20    char *zAff;.. 
1c3d0 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
1c3e0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
1c3f0 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
1c400 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
1c410 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f    k = pIdx->aiCo
1c420 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f  lumn[nEq];     /
1c430 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65  * Column for ine
1c440 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1c450 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  nts */..    /* I
1c460 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69  f this loop sati
1c470 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64  sfies a sort ord
1c480 65 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65  er (pOrderBy) re
1c490 71 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20  quest that .    
1c4a0 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  ** was passed to
1c4b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
1c4c0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53  o implement a "S
1c4d0 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e  ELECT min(x) ...
1c4e0 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c  " .    ** query,
1c4f0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1c500 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77   will only allow
1c510 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e   the loop to run
1c520 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69   for.    ** a si
1c530 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20  ngle iteration. 
1c540 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1c550 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65  the first row re
1c560 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68  turned.    ** sh
1c570 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
1c580 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
1c590 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
1c5a0 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a  umn 'x' is.    *
1c5b0 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
1c5c0 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
1c5d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1c5e0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
1c5f0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71  .    ** this req
1c600 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69  uires some speci
1c610 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
1c620 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
1c630 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
1c640 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
1c650 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70     && (pLevel->p
1c660 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52  lan.wsFlags&WHER
1c670 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20  E_ORDERBY).     
1c680 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
1c690 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20  n>nEq).    ){.  
1c6a0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
1c6b0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
1c6c0 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  1 ); */.      /*
1c6d0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c6e0 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  y->a[0].pExpr->i
1c6f0 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
1c700 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a  Column[nEq] ); *
1c710 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65  /.      isMinQue
1c720 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45  ry = 1;.      nE
1c730 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
1c740 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
1c750 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63  any inequality c
1c760 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
1c770 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e  for the start an
1c780 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66  d end .    ** of
1c790 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
1c7a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
1c7b0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1c7c0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1c7d0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1c7e0 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
1c7f0 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (pWC, iCur, k, n
1c800 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
1c810 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
1c820 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
1c830 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1c840 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1c850 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1c860 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1c870 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
1c880 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1c890 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, k, notReady,
1c8a0 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20   (WO_GT|WO_GE), 
1c8b0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78  pIdx);.      nEx
1c8c0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1c8d0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
1c8e0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1c8f0 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
1c900 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
1c910 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61  = or IN.    ** a
1c920 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  nd store the val
1c930 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
1c940 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  ms in an array o
1c950 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
1c960 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
1c970 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  egBase..    */. 
1c980 20 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64     regBase = cod
1c990 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1c9a0 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  s(.        pPars
1c9b0 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20  e, pLevel, pWC, 
1c9c0 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61  notReady, nExtra
1c9d0 52 65 67 2c 20 26 7a 41 66 66 0a 20 20 20 20 29  Reg, &zAff.    )
1c9e0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1c9f0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1ca00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
1ca10 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
1ca20 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
1ca30 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
1ca40 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
1ca50 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
1ca60 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
1ca70 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
1ca80 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
1ca90 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
1caa0 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
1cab0 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
1cac0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1cad0 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e  f( bRev==(pIdx->
1cae0 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d  aSortOrder[nEq]=
1caf0 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20  =SQLITE_SO_ASC) 
1cb00 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
1cb10 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
1cb20 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
1cb30 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  t);.    }..    t
1cb40 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
1cb50 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74  tart && pRangeSt
1cb60 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
1cb70 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65   WO_LE );.    te
1cb80 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
1cb90 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
1cba0 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1cbb0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_GE );.    tes
1cbc0 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
1cbd0 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
1cbe0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
1cbf0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1cc00 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
1cc10 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
1cc20 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
1cc30 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
1cc40 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
1cc50 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
1cc60 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
1cc70 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
1cc80 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
1cc90 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
1cca0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1ccb0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
1ccc0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
1ccd0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
1cce0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
1ccf0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
1cd00 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1cd10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
1cd20 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1cd30 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1cd40 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
1cd50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
1cd60 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
1cd70 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
1cd80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cd90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
1cda0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
1cdb0 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  q);.      sqlite
1cdc0 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a  3ExprCodeIsNullJ
1cdd0 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72  ump(v, pRight, r
1cde0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
1cdf0 4e 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Nxt);.      if( 
1ce00 7a 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  zAff ){.        
1ce10 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
1ce20 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
1ce30 74 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61  t, zAff[nConstra
1ce40 69 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  int])==SQLITE_AF
1ce50 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
1ce60 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
1ce70 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
1ce80 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
1ce90 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
1cea0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
1ceb0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
1cec0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
1ced0 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
1cee0 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
1cef0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
1cf00 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
1cf10 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66  /.          zAff
1cf20 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20  [nConstraint] = 
1cf30 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1cf40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cf50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1cf60 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1cf70 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1cf80 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74  zAff[nConstraint
1cf90 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
1cfa0 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74  zAff[nConstraint
1cfb0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
1cfc0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
1cfd0 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
1cfe0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1cff0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
1d000 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
1d010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d020 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1d030 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1d040 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1d050 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
1d060 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
1d070 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1d080 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
1d090 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1d0a0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1d0b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 41   nConstraint, zA
1d0c0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
1d0d0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
1d0e0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
1d0f0 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
1d100 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
1d110 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
1d120 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1d130 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
1d140 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
1d150 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
1d160 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1d170 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
1d180 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
1d190 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
1d1a0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
1d1b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1d1c0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
1d1d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d1e0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
1d1f0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
1d200 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
1d210 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
1d220 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
1d230 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
1d240 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1d250 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1d260 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
1d270 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
1d280 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
1d290 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
1d2a0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
1d2b0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1d2c0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
1d2d0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1d2e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d2f0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1d300 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1d310 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d320 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
1d330 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
1d340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d350 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
1d360 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
1d370 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
1d380 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  xt);.      if( z
1d390 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
1d3a0 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
1d3b0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1d3c0 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69  , zAff[nConstrai
1d3d0 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nt])==SQLITE_AFF
1d3e0 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20  _NONE){.        
1d3f0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63    /* Since the c
1d400 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20  omparison is to 
1d410 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74  be performed wit
1d420 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73  h no conversions
1d430 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70  .          ** ap
1d440 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65  plied to the ope
1d450 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1d460 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1d470 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1d480 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49           ** SQLI
1d490 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f  TE_AFF_NONE.  */
1d4a0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b  .          zAff[
1d4b0 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53  nConstraint] = S
1d4c0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1d4d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d4e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1d4f0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
1d500 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
1d510 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d  Aff[nConstraint]
1d520 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
1d530 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d  Aff[nConstraint]
1d540 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
1d550 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
1d560 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f      }  .      co
1d570 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1d580 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1d590 20 6e 45 71 2b 31 2c 20 7a 41 66 66 29 3b 0a 20   nEq+1, zAff);. 
1d5a0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1d5b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
1d5c0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1d5d0 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 0a  se->db, zAff);..
1d5e0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1d5f0 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
1d600 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
1d610 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1d620 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
1d630 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1d640 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
1d650 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
1d660 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
1d670 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70    op = aEndOp[(p
1d680 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29  RangeEnd || nEq)
1d690 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a   * (1 + bRev)];.
1d6a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d6b0 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
1d6c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1d6d0 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74  P_IdxGE );.    t
1d6e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1d6f0 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28  IdxLT );.    if(
1d700 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a   op!=OP_Noop ){.
1d710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d720 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
1d730 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
1d740 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
1d750 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20  nstraint);.     
1d760 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d770 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62  geP5(v, endEq!=b
1d780 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d  Rev ?1:0);.    }
1d790 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1d7a0 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1d7b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68   constraints, ch
1d7c0 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
1d7d0 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ue.    ** of the
1d7e0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68   table column th
1d7f0 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74  at the inequalit
1d800 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e  y contrains is n
1d810 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  ot NULL..    ** 
1d820 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74  If it is, jump t
1d830 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
1d840 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
1d850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20  ..    */.    r1 
1d860 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1d870 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1d880 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
1d890 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1d8a0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
1d8b0 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
1d8c0 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
1d8d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d8e0 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  TOP_LIMIT );.   
1d8f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1d900 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
1d910 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
1d920 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b  RE_TOP_LIMIT) ){
1d930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d940 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1d950 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
1d960 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
1d970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d980 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1d990 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
1d9a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d9b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1d9c0 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
1d9d0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
1d9e0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
1d9f0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
1da00 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
1da10 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
1da20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1da30 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
1da40 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
1da50 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
1da60 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1da70 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1da80 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1da90 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1daa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dab0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
1dac0 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
1dad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dae0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
1daf0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
1db00 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1db10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db20 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
1db30 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
1db40 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
1db50 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
1db60 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1db70 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
1db80 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
1db90 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
1dba0 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
1dbb0 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
1dbc0 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
1dbd0 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
1dbe0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  n..    */.    pL
1dbf0 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
1dc00 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
1dc10 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
1dc20 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
1dc30 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
1dc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
1dc50 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
1dc60 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
1dc70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
1dc80 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f  ULTI_OR ){.    /
1dc90 2a 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f  * Case 4:  Two o
1dca0 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c  r more separatel
1dcb0 79 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  y indexed terms 
1dcc0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a  connected by OR.
1dcd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1dce0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1dcf0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
1dd00 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b  BLE t1(a,b,c,d);
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 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
1dd30 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  a);.    **   CRE
1dd40 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20  ATE INDEX i2 ON 
1dd50 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(b);.    **   
1dd60 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20  CREATE INDEX i3 
1dd70 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a  ON t1(c);.    **
1dd80 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1dd90 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1dda0 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28   a=5 OR b=7 OR (
1ddb0 63 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20  c=11 AND d=13). 
1ddc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
1ddd0 74 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  the example, the
1dde0 72 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64  re are three ind
1ddf0 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65  exed terms conne
1de00 63 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20  cted by OR..    
1de10 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  ** The top of th
1de20 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b  e loop looks lik
1de30 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1de40 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1de50 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1de60 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1de70 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1de80 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20  reg 1.    **.   
1de90 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61   ** Then, for ea
1dea0 63 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c  ch indexed term,
1deb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20   the following. 
1dec0 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
1ded0 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65  .    ** RowSetTe
1dee0 73 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74  st are such that
1def0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1df00 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
1df10 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a   inserted.    **
1df20 20 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74   into the RowSet
1df30 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
1df40 64 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74  dy present, cont
1df50 72 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20  rol skips the.  
1df60 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64    ** Gosub opcod
1df70 65 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61  e and jumps stra
1df80 69 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65  ight to the code
1df90 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68   generated by Wh
1dfa0 65 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a  ereEnd()..    **
1dfb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73  .    **        s
1dfc0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1dfd0 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20  (<term>).    ** 
1dfe0 20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54           RowSetT
1dff0 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1e000 20 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f       # Insert ro
1e010 77 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a  wid into rowset.
1e020 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e030 47 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20  Gosub      2 A. 
1e040 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1e050 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20  ite3WhereEnd(). 
1e060 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c     **.    ** Fol
1e070 6c 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65  lowing the above
1e080 2c 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e  , code to termin
1e090 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61  ate the loop. La
1e0a0 62 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65  bel A, the targe
1e0b0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
1e0c0 47 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d  Gosub above, jum
1e0d0 70 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  ps to the instru
1e0e0 63 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65  ction right afte
1e0f0 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20  r the Goto..    
1e100 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1e110 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1e130 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1e140 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1e150 20 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20            Goto  
1e160 20 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20       B          
1e170 20 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70        # The loop
1e180 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20   is finished..  
1e190 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1e1a0 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e    A: <loop body>
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20   # Return data, 
1e1d0 77 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a  whatever..    **
1e1e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1e1f0 20 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20   Return     2   
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a               # J
1e210 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1e220 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20  Gosub.    **.   
1e230 20 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66   **       B: <af
1e240 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20  ter the loop>.  
1e250 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
1e260 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
1e270 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
1e280 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
1e290 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
1e2a0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
1e2b0 6d 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 2f  m *pFinal;     /
1e2c0 2a 20 46 69 6e 61 6c 20 73 75 62 74 65 72 6d 20  * Final subterm 
1e2d0 77 69 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c  within the OR-cl
1e2e0 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20 53 72 63  ause. */.    Src
1e2f0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
1e300 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
1e310 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
1e320 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
1e330 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ion */..    int 
1e340 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
1e350 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
1e360 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1e370 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
1e380 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
1e390 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1e3c0 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
1e3d0 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
1e3e0 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1e410 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
1e420 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
1e430 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
1e440 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
1e450 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
1e460 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
1e470 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1e4a0 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
1e4b0 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
1e4c0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
1e4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e4e0 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
1e4f0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
1e500 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
1e510 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
1e520 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
1e530 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72  pTerm;.    asser
1e540 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1e550 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1e560 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
1e570 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
1e580 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
1e590 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
1e5a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
1e5b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1e5c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46  Info->wc;.    pF
1e5d0 69 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61  inal = &pOrWc->a
1e5e0 5b 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d  [pOrWc->nTerm-1]
1e5f0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e600 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20   = OP_Return;.  
1e610 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72    pLevel->p1 = r
1e620 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f  egReturn;..    /
1e630 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53  * Set up a new S
1e640 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62  rcList ni pOrTab
1e650 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1e660 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e  table being scan
1e670 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ned.    ** by th
1e680 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61  is loop in the a
1e690 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c  [0] slot and all
1e6a0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
1e6b0 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73   in a[1..] slots
1e6c0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65  ..    ** This be
1e6d0 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73  comes the SrcLis
1e6e0 74 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  t in the recursi
1e6f0 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ve call to sqlit
1e700 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
1e710 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1e720 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20  WInfo->nLevel>1 
1e730 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  ){.      int nNo
1e740 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
1e750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e760 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64  umber of notRead
1e770 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  y tables */.    
1e780 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e790 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20  _item *origSrc; 
1e7a0 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1e7b0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  list of tables *
1e7c0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64  /.      nNotRead
1e7d0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  y = pWInfo->nLev
1e7e0 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b  el - iLevel - 1;
1e7f0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
1e800 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f  sqlite3StackAllo
1e810 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
1e820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1e840 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
1e850 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
1e860 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
1e870 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
1e880 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
1e890 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
1e8a0 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61  ab->nSrc = pOrTa
1e8b0 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 6f 74  b->nAlloc = nNot
1e8c0 52 65 61 64 79 20 2b 20 31 3b 0a 20 20 20 20 20  Ready + 1;.     
1e8d0 20 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e   memcpy(pOrTab->
1e8e0 61 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a  a, pTabItem, siz
1e8f0 65 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b  eof(*pTabItem));
1e900 0a 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d  .      origSrc =
1e910 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
1e920 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  t->a;.      for(
1e930 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64  k=1; k<=nNotRead
1e940 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
1e950 20 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d   memcpy(&pOrTab-
1e960 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b  >a[k], &origSrc[
1e970 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d  pLevel[k].iFrom]
1e980 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d  , sizeof(pOrTab-
1e990 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d  >a[k]));.      }
1e9a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e9b0 20 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66    pOrTab = pWInf
1e9c0 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20  o->pTabList;.   
1e9d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   }..    /* Initi
1e9e0 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74  alize the rowset
1e9f0 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
1ea00 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51  tain NULL. An SQ
1ea10 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a  L NULL is .    *
1ea20 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
1ea30 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e  an empty rowset.
1ea40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1ea50 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  lso initialize r
1ea60 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74  egReturn to cont
1ea70 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  ain the address 
1ea80 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
1ea90 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64  on .    ** immed
1eaa0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1eab0 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61   the OP_Return a
1eac0 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
1ead0 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20  the loop. This. 
1eae0 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
1eaf0 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75  d in a few obscu
1eb00 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73  re LEFT JOIN cas
1eb10 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c  es where control
1eb20 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76   jumps.    ** ov
1eb30 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  er the top of th
1eb40 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20  e loop into the 
1eb50 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74  body of it. In t
1eb60 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20  his case the .  
1eb70 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73    ** correct res
1eb80 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e  ponse for the en
1eb90 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28  d-of-loop code (
1eba0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69  the OP_Return) i
1ebb0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c  s to .    ** fal
1ebc0 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1ebd0 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1ebe0 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50  n, just as an OP
1ebf0 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20  _Next does if.  
1ec00 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61    ** called on a
1ec10 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
1ec20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
1ec30 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1ec40 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1ec50 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1ec60 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1ec70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ec80 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1ec90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1eca0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1ecb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ecc0 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1ecd0 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1ece0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1ecf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ed00 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1ed10 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1ed20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
1ed30 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
1ed40 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1ed50 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
1ed60 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
1ed70 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
1ed80 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1ed90 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  || pOrTerm->eOpe
1eda0 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
1edb0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e  .        WhereIn
1edc0 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20  fo *pSubWInfo;  
1edd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
1ede0 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
1edf0 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
1ee00 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
1ee10 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
1ee20 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
1ee30 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
1ee40 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
1ee50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1ee60 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
1ee70 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  b, pOrTerm->pExp
1ee80 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
1eea0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20  ERE_OMIT_OPEN | 
1eeb0 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45  WHERE_OMIT_CLOSE
1eec0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
1eed0 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
1eee0 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20 57  _FORCE_TABLE | W
1eef0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1ef00 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  LY);.        if(
1ef10 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
1ef20 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
1ef30 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1ef40 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
1ef50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1ef60 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
1ef70 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
1ef80 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
1ef90 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
1efa0 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
1efb0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1efc0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
1efd0 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
1efe0 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
1f020 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f030 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1f040 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
1f050 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f080 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1f090 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69  tAddr(v)+2, r, i
1f0a0 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
1f0b0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1f0c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f0d0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
1f0e0 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
1f0f0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1f100 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  The pSubWInfo->u
1f110 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61  ntestedTerms fla
1f120 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  g means that thi
1f130 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20  s OR term.      
1f140 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64      ** contained
1f150 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44   one or more AND
1f160 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74   term from a not
1f170 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68  Ready table.  Th
1f180 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
1f190 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f  erms from the no
1f1a0 74 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75  tReady table cou
1f1b0 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  ld not be tested
1f1c0 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20   and will.      
1f1d0 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62      ** need to b
1f1e0 65 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a  e tested later..
1f1f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1f200 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
1f210 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
1f220 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65  rms ) untestedTe
1f230 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  rms = 1;..      
1f240 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68      /* Finish th
1f250 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  e loop through t
1f260 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
1f270 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
1f280 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
1f290 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1f2a0 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20  nd(pSubWInfo);. 
1f2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f2c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f2d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
1f2e0 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69  , iRetInit, sqli
1f2f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1f300 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
1f310 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f320 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
1f330 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
1f340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1f350 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c  solveLabel(v, iL
1f360 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69  oopBody);..    i
1f370 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  f( pWInfo->nLeve
1f380 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61  l>1 ) sqlite3Sta
1f390 63 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  ckFree(pParse->d
1f3a0 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20  b, pOrTab);.    
1f3b0 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72  if( !untestedTer
1f3c0 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d  ms ) disableTerm
1f3d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
1f3e0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
1f3f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
1f400 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
1f410 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61  /..  {.    /* Ca
1f420 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
1f430 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
1f440 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
1f450 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20  omplete.    **  
1f460 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20          scan of 
1f470 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
1f480 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1f490 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
1f4a0 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74  ep[] = { OP_Next
1f4b0 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20  , OP_Prev };.   
1f4c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f4d0 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50   aStart[] = { OP
1f4e0 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74  _Rewind, OP_Last
1f4f0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1f500 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d  bRev==0 || bRev=
1f510 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
1f520 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1f530 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1f540 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a   = aStep[bRev];.
1f550 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
1f560 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65   iCur;.    pLeve
1f570 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
1f580 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f590 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69   aStart[bRev], i
1f5a0 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20  Cur, addrBrk);. 
1f5b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
1f5c0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
1f5d0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
1f5e0 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20  .  }.  notReady 
1f5f0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d  &= ~getMask(pWC-
1f600 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
1f610 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  ;..  /* Insert c
1f620 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
1f630 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
1f640 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
1f650 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
1f660 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
1f670 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
1f680 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b 20 3d  bles..  */.  k =
1f690 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
1f6a0 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e  pWC->a, j=pWC->n
1f6b0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
1f6c0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pTerm++){.    Ex
1f6d0 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74  pr *pE;.    test
1f6e0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
1f6f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1f700 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  UAL );.    testc
1f710 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1f720 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1f730 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
1f740 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
1f750 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
1f760 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
1f770 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
1f780 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
1f790 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
1f7a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f7b0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
1f7c0 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20  erms==0.        
1f7d0 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
1f7e0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
1f7f0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
1f800 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  NLY)!=0 );.     
1f810 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
1f820 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
1f830 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f840 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  }.    pE = pTerm
1f850 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
1f860 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
1f870 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1f880 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
1f890 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
1f8a0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1f8b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1f8c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f8d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f8e0 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
1f8f0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
1f900 4e 55 4c 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31  NULL);.    k = 1
1f910 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
1f920 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
1f930 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ED;.  }..  /* Fo
1f940 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
1f950 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
1f960 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
1f970 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1f980 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
1f990 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
1f9a0 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
1f9b0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
1f9c0 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
1f9d0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
1f9e0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
1f9f0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
1fa00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1fa10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1fa20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fa30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fa40 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
1fa50 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1fa60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
1fa70 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
1fa80 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
1fa90 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1faa0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
1fab0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1fac0 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
1fad0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
1fae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1faf0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1fb00 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1fb10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fb20 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1fb30 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
1fb40 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1fb50 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
1fb60 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
1fb70 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
1fb80 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1fb90 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
1fba0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
1fbb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fbc0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
1fbd0 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
1fbe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1fbf0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1fc00 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
1fc10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1fc20 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1fc30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
1fc40 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
1fc50 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1fc60 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
1fc70 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
1fc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1fc90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1fca0 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
1fcb0 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
1fcc0 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  urn notReady;.}.
1fcd0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1fce0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1fcf0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
1fd00 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
1fd10 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
1fd20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
1fd30 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
1fd40 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
1fd50 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
1fd60 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
1fd70 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
1fd80 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
1fd90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
1fda0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1fdb0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
1fdc0 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
1fdd0 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
1fde0 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
1fdf0 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
1fe00 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
1fe10 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
1fe20 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe40 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
1fe50 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
1fe60 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
1fe70 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
1fe80 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
1fe90 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
1fea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1feb0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
1fec0 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
1fed0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
1fee0 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
1fef0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1ff00 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
1ff10 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
1ff20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
1ff30 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
1ff40 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
1ff50 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
1ff60 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
1ff70 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49     /* assert( pI
1ff80 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1ff90 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e  dxStr==0 || db->
1ffa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20  mallocFailed ); 
1ffb0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1ffc0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
1ffd0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
1ffe0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1fff0 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  (pInfo->idxStr);
20000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20010 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20020 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20  (db, pInfo);.   
20030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
20040 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
20050 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20  pWInfo->pWC);.  
20060 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20070 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
20080 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
20090 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
200a0 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
200b0 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
200c0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
200d0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
200e0 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
200f0 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
20100 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
20110 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
20120 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
20130 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
20140 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
20150 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
20160 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
20170 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
20180 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
20190 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
201a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
201b0 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
201c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
201d0 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
201e0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
201f0 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
20200 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
20210 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
20220 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
20230 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
20240 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
20250 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
20260 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
20270 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
20280 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
20290 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
202a0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
202b0 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
202c0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
202d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
202e0 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
202f0 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
20300 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
20310 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
20320 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
20330 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
20340 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
20350 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
20360 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
20370 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
20380 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
20390 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
203a0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
203b0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
203c0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
203d0 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
203e0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
203f0 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
20400 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
20410 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
20420 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
20430 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
20460 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
20470 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
20480 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
20490 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
204a0 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
204d0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
204e0 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
204f0 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
20500 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
20510 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
20520 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20530 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
20540 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
20550 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
20560 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
20570 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
20580 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
20590 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
205a0 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
205b0 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
205c0 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
205d0 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
205e0 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
205f0 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
20600 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
20610 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
20620 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
20630 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
20640 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
20650 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
20660 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
20670 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
20680 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
20690 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
206a0 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
206b0 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
206c0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
206d0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
206e0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
206f0 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
20700 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
20710 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
20720 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
20730 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
20740 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
20750 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
20760 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
20770 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
20780 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
20790 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
207a0 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
207b0 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
207c0 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
207d0 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
207e0 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
207f0 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
20800 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
20810 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
20820 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
20830 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
20840 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
20850 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
20860 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
20870 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
20880 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
20890 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
208a0 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
208b0 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
208c0 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
208d0 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
208e0 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
208f0 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
20900 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
20910 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
20920 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
20930 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
20940 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
20950 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
20960 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
20970 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
20980 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
20990 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
209a0 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
209b0 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
209c0 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
209d0 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
209e0 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
209f0 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
20a00 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
20a10 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
20a20 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
20a30 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
20a40 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
20a50 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
20a60 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
20a70 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
20a80 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
20a90 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
20aa0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
20ab0 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
20ac0 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
20ad0 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
20ae0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
20af0 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
20b00 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
20b10 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
20b20 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
20b30 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
20b40 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
20b50 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
20b60 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
20b70 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
20b80 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
20b90 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
20ba0 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
20bb0 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
20bc0 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
20bd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
20be0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
20bf0 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
20c00 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
20c10 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
20c20 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
20c30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
20c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
20c50 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
20c60 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
20c70 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
20c80 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
20c90 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
20ca0 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
20cb0 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
20cc0 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
20cd0 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
20ce0 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
20cf0 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
20d00 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
20d10 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
20d20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
20d30 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
20d40 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
20d50 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
20d60 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
20d70 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
20d80 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
20d90 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
20da0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
20db0 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
20dc0 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
20dd0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
20de0 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
20df0 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
20e00 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
20e10 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
20e20 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
20e30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20e40 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
20e50 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
20e60 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
20e70 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
20e80 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
20e90 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
20ea0 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
20eb0 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
20ec0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
20ed0 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
20ee0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
20ef0 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
20f00 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
20f10 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
20f20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
20f30 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
20f40 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
20f50 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
20f60 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
20f70 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
20f80 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
20f90 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
20fa0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20fb0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20fc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
20fd0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
20fe0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
20ff0 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
21000 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
21010 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
21020 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
21030 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
21040 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
21050 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
21060 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20  pOrderBy, /* An 
21070 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
21080 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31   or NULL */.  u1
21090 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
210a0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
210b0 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
210c0 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
210d0 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69  eInt.h */.){.  i
210e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
210f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21100 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
21110 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
21120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21130 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
21140 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
21150 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
21160 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
21170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21180 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
21190 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
211a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
211b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
211c0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
211d0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
211e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
211f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
21200 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
21210 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
21220 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
21230 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
21240 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
21250 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
21260 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
21270 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
21280 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
21290 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
212a0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
212b0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
212c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
212d0 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
212e0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
212f0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
21300 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21310 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
21320 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
21330 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
21340 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
21350 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
21360 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
21370 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
21380 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ist */.  int iFr
21390 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
213a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
213b0 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c  t unused FROM cl
213c0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ause element */.
213d0 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20    int andFlags; 
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213f0 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69  AND-ed combinati
21400 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61  on of all pWC->a
21410 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20  [].wtFlags */.  
21420 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
21430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
21440 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21450 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  n */..  /* The n
21460 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
21470 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
21480 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
21490 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
214a0 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
214b0 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66  tmask .  */.  if
214c0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
214d0 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
214e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
214f0 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
21500 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
21510 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
21520 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
21530 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   This function n
21540 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  ormally generate
21550 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  s a nested loop 
21560 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  for all tables i
21570 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  n .  ** pTabList
21580 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48  .  But if the WH
21590 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
215a0 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  Y flag is set, t
215b0 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20  hen we should.  
215c0 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  ** only generate
215d0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69   code for the fi
215e0 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61  rst table in pTa
215f0 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65  bList and assume
21600 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63   that.  ** any c
21610 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
21620 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e  d with subsequen
21630 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69  t tables are uni
21640 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
21650 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77  .  nTabList = (w
21660 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21670 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29  E_ONETABLE_ONLY)
21680 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
21690 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
216a0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
216b0 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
216c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
216d0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
216e0 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
216f0 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
21700 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
21710 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
21720 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
21730 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
21740 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
21750 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
21760 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
21770 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
21780 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
21790 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
217a0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
217b0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
217c0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
217d0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
217e0 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
217f0 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
21800 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
21810 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
21820 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
21830 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
21840 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65  rse->db;.  nByte
21850 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
21860 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
21870 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69  +(nTabList-1)*si
21880 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
21890 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  );.  pWInfo = sq
218a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
218b0 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79  o(db, .      nBy
218c0 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20  teWInfo + .     
218d0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61   sizeof(WhereCla
218e0 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a  use) +.      siz
218f0 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74  eof(WhereMaskSet
21900 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ).  );.  if( db-
21910 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
21920 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
21930 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
21940 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
21950 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
21960 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
21970 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
21980 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
21990 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
219a0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
219b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
219c0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
219d0 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c  = pWC = (WhereCl
219e0 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70  ause *)&((u8 *)p
219f0 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66  WInfo)[nByteWInf
21a00 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  o];.  pWInfo->wc
21a10 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
21a20 46 6c 61 67 73 3b 0a 20 20 70 4d 61 73 6b 53 65  Flags;.  pMaskSe
21a30 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65  t = (WhereMaskSe
21a40 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f  t*)&pWC[1];..  /
21a50 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
21a60 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
21a70 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
21a80 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
21a90 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
21aa0 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
21ab0 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
21ac0 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
21ad0 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
21ae0 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
21af0 49 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73 65  Init(pWC, pParse
21b00 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73  , pMaskSet);.  s
21b10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
21b20 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20  nstants(pParse, 
21b30 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65  pWhere);.  where
21b40 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72  Split(pWC, pWher
21b50 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
21b60 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
21b70 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
21b80 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
21b90 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
21ba0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
21bb0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
21bc0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
21bd0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
21be0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
21bf0 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62   pWhere && (nTab
21c00 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  List==0 || sqlit
21c10 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
21c20 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29  NotJoin(pWhere))
21c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21c40 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
21c50 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
21c60 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54  o->iBreak, SQLIT
21c70 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
21c80 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
21c90 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20   }..  /* Assign 
21ca0 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62  a bit from the b
21cb0 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20  itmask to every 
21cc0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
21cd0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
21ce0 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e  ** When assignin
21cf0 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73  g bitmask values
21d00 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   to FROM clause 
21d10 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74  cursors, it must
21d20 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73   be.  ** the cas
21d30 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74  e that if X is t
21d40 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
21d50 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61  he N-th FROM cla
21d60 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20  use term then.  
21d70 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  ** the bitmask f
21d80 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75  or all FROM clau
21d90 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  se terms to the 
21da0 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68  left of the N-th
21db0 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58   term.  ** is (X
21dc0 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73  -1).   An expres
21dd0 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e  sion from the ON
21de0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
21df0 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20  T JOIN can use. 
21e00 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69   ** its Expr.iRi
21e10 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c  ghtJoinTable val
21e20 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62  ue to find the b
21e30 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69  itmask of the ri
21e40 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ght table.  ** o
21e50 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62  f the join.  Sub
21e60 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f  tracting one fro
21e70 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  m the right tabl
21e80 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20  e bitmask gives 
21e90 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66  a.  ** bitmask f
21ea0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
21eb0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
21ec0 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20   join.  Knowing 
21ed0 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
21ee0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
21ef0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61  to the left of a
21f00 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d   left join is im
21f10 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74  portant.  Ticket
21f20 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a   #3015..  **.  *
21f30 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
21f40 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73  WhereClause.vmas
21f50 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  k variable so th
21f60 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72  at bits that cor
21f70 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20  respond.  ** to 
21f80 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
21f90 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54  rsors are set. T
21fa0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
21fb0 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62  electively disab
21fc0 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d  le .  ** the OR-
21fd0 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61  to-IN transforma
21fe0 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c  tion in exprAnal
21ff0 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20  yzeOrTerm(). It 
22000 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a  is not helpful .
22010 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61    ** with virtua
22020 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
22030 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
22040 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
22050 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
22060 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
22070 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
22080 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
22090 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
220a0 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
220b0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
220c0 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
220d0 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
220e0 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
220f0 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
22100 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  * WHERE_ONETABLE
22110 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
22120 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
22130 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20  ( pWC->vmask==0 
22140 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d  && pMaskSet->n==
22150 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
22160 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
22170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
22180 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  teMask(pMaskSet,
22190 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
221a0 69 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65  iCursor);.#ifnde
221b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
221c0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
221d0 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69  f( ALWAYS(pTabLi
221e0 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26  st->a[i].pTab) &
221f0 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
22200 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
22210 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76   ){.      pWC->v
22220 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  mask |= ((Bitmas
22230 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d  k)1 << i);.    }
22240 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e  .#endif.  }.#ifn
22250 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
22260 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
22270 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
22280 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
22290 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
222a0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
222b0 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
222c0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
222d0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
222e0 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
222f0 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
22300 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
22310 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
22320 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
22330 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
22340 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
22350 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
22360 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
22370 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
22380 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
22390 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
223a0 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
223b0 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
223c0 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
223d0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
223e0 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
223f0 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
22400 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
22410 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
22420 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
22430 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
22440 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  cessed..  */.  e
22450 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
22460 61 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20  abList, pWC);.  
22470 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
22480 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
22490 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
224a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73  ;.  }..  /* Chos
224b0 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
224c0 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68   to use for each
224d0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
224e0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
224f0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66    ** This loop f
22500 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ills in the foll
22510 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20  owing fields:.  
22520 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  **.  **   pWInfo
22530 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20  ->a[].pIdx      
22540 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65  The index to use
22550 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20   for this level 
22560 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a  of the loop..  *
22570 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
22580 77 73 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f  wsFlags   WHERE_
22590 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69  xxx flags associ
225a0 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20  ated with pIdx. 
225b0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
225c0 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20  ].nEq       The 
225d0 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64  number of == and
225e0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   IN constraints.
225f0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
22600 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69  [].iFrom     Whi
22610 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  ch term of the F
22620 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
22630 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
22640 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
22650 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
22660 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
22670 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
22680 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
22690 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
226a0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
226b0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20  he index.  **   
226c0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72  pWInfo->a[].pTer
226d0 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61  m     When wsFla
226e0 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f  gs==WO_OR, the O
226f0 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20  R-clause term.  
22700 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
22710 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f  p also figures o
22720 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f  ut the nesting o
22730 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  rder of tables i
22740 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20  n the FROM.  ** 
22750 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e  clause..  */.  n
22760 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
22770 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65  ask)0;.  pTabIte
22780 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
22790 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  .  pLevel = pWIn
227a0 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67  fo->a;.  andFlag
227b0 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54  s = ~0;.  WHERET
227c0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
227d0 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
227e0 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72  "));.  for(i=iFr
227f0 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  om=0, pLevel=pWI
22800 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69  nfo->a; i<nTabLi
22810 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  st; i++, pLevel+
22820 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73  +){.    WhereCos
22830 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20  t bestPlan;     
22840 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69      /* Most effi
22850 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20  cient plan seen 
22860 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e  so far */.    In
22870 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
22880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22890 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c  ex for FROM tabl
228a0 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f  e at pTabItem */
228b0 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
228e0 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73  over FROM tables
228f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
22900 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  J = -1;         
22910 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
22920 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74   of j */.    Bit
22930 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20  mask m;         
22940 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
22950 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20  ask value for j 
22960 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20  or bestJ */.    
22970 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20  int isOptimal;  
22980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22990 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69  terator for opti
229a0 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20  mal/non-optimal 
229b0 73 65 61 72 63 68 20 2a 2f 0a 0a 20 20 20 20 6d  search */..    m
229c0 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c  emset(&bestPlan,
229d0 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50   0, sizeof(bestP
229e0 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50  lan));.    bestP
229f0 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49  lan.rCost = SQLI
22a00 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 20  TE_BIG_DBL;..   
22a10 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
22a20 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65   the remaining e
22a30 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ntries in the FR
22a40 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e  OM clause to fin
22a50 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  d the.    ** nex
22a60 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54  t nested loop. T
22a70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  he FROM clause e
22a80 6e 74 72 69 65 73 20 6d 61 79 20 62 65 20 69 74  ntries may be it
22a90 65 72 61 74 65 64 20 74 68 72 6f 75 67 68 0a 20  erated through. 
22aa0 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63     ** either onc
22ab0 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20  e or twice. .   
22ac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
22ad0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2c 20  irst iteration, 
22ae0 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20  which is always 
22af0 70 65 72 66 6f 72 6d 65 64 2c 20 73 65 61 72 63  performed, searc
22b00 68 65 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20  hes for the.    
22b10 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
22b20 6e 74 72 79 20 74 68 61 74 20 70 65 72 6d 69 74  ntry that permit
22b30 73 20 74 68 65 20 6c 6f 77 65 73 74 2d 63 6f 73  s the lowest-cos
22b40 74 2c 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61  t, "optimal" sca
22b50 6e 2e 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69  n. In.    ** thi
22b60 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74  s context an opt
22b70 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65  imal scan is one
22b80 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
22b90 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20  ame strategy.   
22ba0 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65   ** for the give
22bb0 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  n FROM clause en
22bc0 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20  try as would be 
22bd0 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20  selected if the 
22be0 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72  entry.    ** wer
22bf0 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e  e used as the in
22c00 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c  nermost nested l
22c10 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  oop.  In other w
22c20 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20  ords, a table.  
22c30 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73    ** is chosen s
22c40 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73  uch that the cos
22c50 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61  t of running tha
22c60 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  t table cannot b
22c70 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a  e reduced.    **
22c80 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20   by waiting for 
22c90 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
22ca0 72 75 6e 20 66 69 72 73 74 2e 0a 20 20 20 20 2a  run first..    *
22cb0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
22cc0 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 69 73  ond iteration is
22cd0 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20   only performed 
22ce0 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63  if no optimal sc
22cf0 61 6e 20 73 74 72 61 74 65 67 69 65 73 0a 20 20  an strategies.  
22d00 20 20 2a 2a 20 77 65 72 65 20 66 6f 75 6e 64 20    ** were found 
22d10 62 79 20 74 68 65 20 66 69 72 73 74 2e 20 54 68  by the first. Th
22d20 69 73 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  is iteration is 
22d30 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66  used to search f
22d40 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f  or the.    ** lo
22d50 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f  west cost scan o
22d60 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20  verall..    **. 
22d70 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76     ** Previous v
22d80 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
22d90 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79  e performed only
22da0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
22db0 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74  ation -.    ** t
22dc0 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73  he next outermos
22dd0 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79  t loop was alway
22de0 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  s that with the 
22df0 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20  lowest overall. 
22e00 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65     ** cost. Howe
22e10 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20  ver, this meant 
22e20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c  that SQLite coul
22e30 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f  d select the wro
22e40 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66  ng plan.    ** f
22e50 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20  or scripts such 
22e60 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
22e70 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20  :.    **   .    
22e80 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
22e90 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20  E t1(a, b); .   
22ea0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
22eb0 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20  LE t2(c, d);.   
22ec0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
22ed0 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45  ROM t2, t1 WHERE
22ee0 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61   t2.rowid = t1.a
22ef0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
22f00 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67  The best strateg
22f10 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20  y is to iterate 
22f20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31  through table t1
22f30 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20   first. However 
22f40 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
22f50 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
22f60 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68  ermine this with
22f70 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79   a simple greedy
22f80 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20   algorithm..    
22f90 2a 2a 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  ** However, sinc
22fa0 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
22fb0 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
22fc0 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20  ugh table t2 is 
22fd0 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a  the same .    **
22fe0 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20   as the cost of 
22ff0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
23000 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20  rough table t1, 
23010 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
23020 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68  .    ** algorith
23030 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  m may choose to 
23040 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f  use t2 for the o
23050 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68  uter loop, which
23060 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a   is a much.    *
23070 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f  * costlier appro
23080 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ach..    */.    
23090 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 31 3b  for(isOptimal=1;
230a0 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26   isOptimal>=0 &&
230b0 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69   bestJ<0; isOpti
230c0 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69  mal--){.      Bi
230d0 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 28 69 73  tmask mask = (is
230e0 4f 70 74 69 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f  Optimal ? 0 : no
230f0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 61  tReady);.      a
23100 73 73 65 72 74 28 20 28 6e 54 61 62 4c 69 73 74  ssert( (nTabList
23110 2d 69 46 72 6f 6d 29 3e 31 20 7c 7c 20 69 73 4f  -iFrom)>1 || isO
23120 70 74 69 6d 61 6c 20 29 3b 0a 20 20 20 20 20 20  ptimal );.      
23130 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61  for(j=iFrom, pTa
23140 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d  bItem=&pTabList-
23150 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73  >a[j]; j<nTabLis
23160 74 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  t; j++, pTabItem
23170 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
23180 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20   doNotReorder;  
23190 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
231a0 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
231b0 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
231c0 2a 2f 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  */.        Where
231d0 43 6f 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20  Cost sCost;     
231e0 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74  /* Cost informat
231f0 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69  ion from best[Vi
23200 72 74 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f  rtual]Index() */
23210 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
23220 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
23230 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23240 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70   for index to op
23250 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20  timize */.  .   
23260 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65       doNotReorde
23270 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e  r =  (pTabItem->
23280 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
23290 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
232a0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  0;.        if( j
232b0 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74  !=iFrom && doNot
232c0 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
232d0 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74  .        m = get
232e0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
232f0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
23300 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
23310 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  m & notReady)==0
23320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
23330 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
23340 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  om++;.          
23350 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23360 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4f 72 64    }.        pOrd
23370 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20 26 26  erBy = ((i==0 &&
23380 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a 70 70   ppOrderBy )?*pp
23390 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20 20 0a 20  OrderBy:0);.  . 
233a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
233b0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b  TabItem->pTab );
233c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
233d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
233e0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  E.        if( Is
233f0 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
23400 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
23410 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
23420 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26  ex_info **pp = &
23430 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64  pWInfo->a[j].pId
23440 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  xInfo;.         
23450 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
23460 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
23470 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70  TabItem, mask, p
23480 4f 72 64 65 72 42 79 2c 20 26 73 43 6f 73 74 2c  OrderBy, &sCost,
23490 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   pp);.        }e
234a0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
234b0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
234c0 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
234d0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
234e0 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64  Item, mask, pOrd
234f0 65 72 42 79 2c 20 26 73 43 6f 73 74 29 3b 0a 20  erBy, &sCost);. 
23500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23510 20 61 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d   assert( isOptim
23520 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65  al || (sCost.use
23530 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  d&notReady)==0 )
23540 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ;..        if( (
23550 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65  sCost.used&notRe
23560 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ady)==0.        
23570 20 26 26 20 28 6a 3d 3d 69 46 72 6f 6d 20 7c 7c   && (j==iFrom ||
23580 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73   sCost.rCost<bes
23590 74 50 6c 61 6e 2e 72 43 6f 73 74 29 20 0a 20 20  tPlan.rCost) .  
235a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
235b0 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
235c0 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ost;.          b
235d0 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
235e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
235f0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
23600 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23610 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23620 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
23630 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
23640 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
23650 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
23660 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
23670 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
23680 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
23690 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
236a0 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c   %d for loop %d\
236b0 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20  n", bestJ,.     
236c0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49        pLevel-pWI
236d0 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66  nfo->a));.    if
236e0 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e  ( (bestPlan.plan
236f0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
23700 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a  _ORDERBY)!=0 ){.
23710 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79        *ppOrderBy
23720 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
23730 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74  andFlags &= best
23740 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
23750 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  s;.    pLevel->p
23760 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70  lan = bestPlan.p
23770 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20 62 65 73  lan;.    if( bes
23780 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
23790 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
237a0 45 44 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ED ){.      pLev
237b0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
237c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
237d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
237e0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
237f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
23800 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
23810 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
23820 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
23830 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
23840 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28  Level->iFrom = (
23850 75 38 29 62 65 73 74 4a 3b 0a 0a 20 20 20 20 2f  u8)bestJ;..    /
23860 2a 20 43 68 65 63 6b 20 74 68 61 74 20 69 66 20  * Check that if 
23870 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65  the table scanne
23880 64 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69  d by this loop i
23890 74 65 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a  teration had an.
238a0 20 20 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42      ** INDEXED B
238b0 59 20 63 6c 61 75 73 65 20 61 74 74 61 63 68 65  Y clause attache
238c0 64 20 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68  d to it, that th
238d0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73  e named index is
238e0 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73   being.    ** us
238f0 65 64 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e  ed for the scan.
23900 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75   If not, then qu
23910 65 72 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ery compilation 
23920 68 61 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  has failed..    
23930 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
23940 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  or..    */.    p
23950 49 64 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Idx = pTabList->
23960 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b  a[bestJ].pIndex;
23970 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b  .    if( pIdx ){
23980 0a 20 20 20 20 20 20 69 66 28 20 28 62 65 73 74  .      if( (best
23990 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
239a0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
239b0 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)==0 ){.       
239c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
239d0 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
239e0 20 75 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c   use index: %s",
239f0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pIdx->zName);. 
23a00 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72         goto wher
23a10 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
23a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a30 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58    /* If an INDEX
23a40 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
23a50 75 73 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e  used, the bestIn
23a60 64 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  dex() function i
23a70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61  s.        ** gua
23a80 72 61 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20  ranteed to find 
23a90 74 68 65 20 69 6e 64 65 78 20 73 70 65 63 69 66  the index specif
23aa0 69 65 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58  ied in the INDEX
23ab0 45 44 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ED BY clause.   
23ac0 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69       ** if it fi
23ad0 6e 64 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61  nd an index at a
23ae0 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
23af0 73 73 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e  ssert( bestPlan.
23b00 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64  plan.u.pIdx==pId
23b10 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x );.      }.   
23b20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52   }.  }.  WHERETR
23b30 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
23b40 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a  zer Finished ***
23b50 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61  \n"));.  if( pPa
23b60 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
23b70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
23b80 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
23b90 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
23ba0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
23bb0 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
23bc0 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
23bd0 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
23be0 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
23bf0 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
23c00 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
23c10 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
23c20 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
23c30 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
23c40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
23c50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
23c60 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
23c70 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
23c80 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
23c90 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
23ca0 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
23cb0 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
23cc0 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
23cd0 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
23ce0 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
23cf0 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
23d00 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
23d10 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
23d20 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
23d30 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
23d40 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
23d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  */.  assert( (wc
23d60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
23d70 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
23d80 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
23d90 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
23da0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
23db0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
23dc0 45 53 49 52 45 44 29 21 3d 30 20 26 26 20 28 61  ESIRED)!=0 && (a
23dd0 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
23de0 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20  UNIQUE)!=0 ){.  
23df0 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50    pWInfo->okOneP
23e00 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49  ass = 1;.    pWI
23e10 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77  nfo->a[0].plan.w
23e20 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  sFlags &= ~WHERE
23e30 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _IDX_ONLY;.  }..
23e40 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61    /* Open all ta
23e50 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61 62  bles in the pTab
23e60 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64  List and any ind
23e70 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f  ices selected fo
23e80 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67  r.  ** searching
23e90 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
23ea0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
23eb0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
23ec0 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e  arse, -1); /* In
23ed0 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20  sert the cookie 
23ee0 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f  verifier Goto */
23ef0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
23f00 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
23f10 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70  nTabList; i++, p
23f20 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
23f30 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
23f40 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
23f50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
23f60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23f70 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
23f80 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
23f90 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  dex */..#ifndef 
23fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
23fb0 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72  AIN.    if( pPar
23fc0 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
23fd0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d  {.      char *zM
23fe0 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  sg;.      struct
23ff0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24000 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
24010 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
24020 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  m];.      zMsg =
24030 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
24040 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20  db, "TABLE %s", 
24050 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
24060 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24070 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
24080 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
24090 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
240a0 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a  g, "%s AS %s", z
240b0 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
240c0 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
240d0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
240e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
240f0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
24100 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
24110 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
24120 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
24130 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c   WITH INDEX %s",
24140 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67  .           zMsg
24150 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  , pLevel->plan.u
24160 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pIdx->zName);. 
24170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
24180 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
24190 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
241a0 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  I_OR ){.        
241b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
241c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
241d0 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49   "%s VIA MULTI-I
241e0 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73  NDEX UNION", zMs
241f0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
24200 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
24210 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
24220 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
24230 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
24240 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
24250 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
24260 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
24270 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
24280 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
24290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
242a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
242b0 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
242c0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
242d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
242e0 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
242f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24300 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
24310 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
24320 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
24330 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  x;.        zMsg 
24340 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
24350 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
24360 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
24370 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
24380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24390 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
243a0 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
243b0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
243c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
243d0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
243e0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
243f0 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
24400 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
24410 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
24420 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42  Msg, "%s ORDER B
24430 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
24440 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24450 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
24460 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
24470 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
24480 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
24490 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
244a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
244b0 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
244c0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
244d0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
244e0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
244f0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
24500 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
24510 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
24520 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
24530 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
24540 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
24550 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
24560 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
24570 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
24580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
24590 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
245a0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
245b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
245c0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
245d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
245e0 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
245f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
24600 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
24610 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
24620 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
24630 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
24640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24650 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
24660 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
24670 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
24680 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
24690 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
246a0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
246b0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
246c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
246d0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
246e0 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
246f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
24700 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
24710 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
24720 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
24730 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
24740 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
24750 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
24760 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
24770 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20   op);.      if( 
24780 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
24790 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
247a0 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
247b0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
247c0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
247d0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
247e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
247f0 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
24800 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
24810 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
24820 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24830 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
24860 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
24870 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
24880 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
24890 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
248a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
248b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
248c0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
248d0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
248e0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
248f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
24900 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61  l->iTabCur = pTa
24910 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
24920 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
24930 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
24940 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
24950 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  0 ){.      Index
24960 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   *pIx = pLevel->
24970 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20  plan.u.pIdx;.   
24980 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
24990 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
249a0 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
249b0 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Ix);.      int i
249c0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
249d0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
249e0 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63  assert( pIx->pSc
249f0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
24a00 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ema );.      ass
24a10 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d 30 20  ert( iIdxCur>=0 
24a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24a30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
24a40 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
24a50 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
24a60 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
24a70 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
24a80 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
24a90 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
24aa0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24ab0 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a  (v, "%s", pIx->z
24ac0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
24ad0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
24ae0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
24af0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
24b00 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
24b10 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
24b20 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65  ddr(v);..  /* Ge
24b30 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
24b40 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
24b50 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
24b60 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
24b70 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
24b80 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
24b90 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
24ba0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
24bb0 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
24bc0 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
24bd0 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
24be0 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73  r(i=0; i<nTabLis
24bf0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 74  t; i++){.    not
24c00 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c  Ready = codeOneL
24c10 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
24c20 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20   i, wctrlFlags, 
24c30 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
24c40 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
24c50 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
24c60 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
24c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24c80 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
24c90 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
24ca0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
24cb0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
24cc0 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
24cd0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
24ce0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
24cf0 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
24d00 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
24d10 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
24d20 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
24d30 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
24d40 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
24d50 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
24d60 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
24d70 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
24d80 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
24d90 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
24da0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
24db0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
24dc0 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
24dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62   for(i=0; i<nTab
24de0 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  List; i++){.    
24df0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
24e00 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
24e10 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
24e20 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
24e30 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
24e40 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
24e50 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
24e60 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
24e70 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
24e80 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
24e90 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
24ea0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
24eb0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
24ec0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
24ed0 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
24ee0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
24ef0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24f00 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
24f10 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
24f20 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
24f30 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
24f40 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
24f50 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
24f60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24f70 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
24f80 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
24f90 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
24fa0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
24fb0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
24fc0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
24fd0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
24fe0 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
24ff0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
25000 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
25010 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
25020 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
25030 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25040 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
25050 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
25060 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
25070 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
25080 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
25090 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
250a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
250b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
250c0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
250d0 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
250e0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
250f0 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
25100 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
25110 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
25120 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
25130 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
25140 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
25150 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
25160 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
25170 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
25180 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
25190 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
251a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
251b0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
251c0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
251d0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
251e0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
251f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25200 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
25210 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
25220 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
25230 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
25240 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
25250 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
25260 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
25270 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
25280 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
25290 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
252a0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
252b0 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
252c0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
252d0 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
252e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
252f0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
25300 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
25310 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
25320 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
25330 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
25340 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
25350 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
25360 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
25370 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
25380 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
25390 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
253a0 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
253b0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
253c0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
253d0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
253e0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
253f0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68  BeginError:.  wh
25400 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
25410 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
25420 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
25430 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
25440 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
25450 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
25460 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
25470 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
25480 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
25490 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
254a0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
254b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
254c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
254d0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
254e0 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
254f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25500 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
25510 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
25520 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
25530 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
25540 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
25550 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
25560 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
25570 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
25580 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
25590 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
255a0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
255b0 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e   for(i=pWInfo->n
255c0 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  Level-1; i>=0; i
255d0 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
255e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
255f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
25600 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25610 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
25620 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
25630 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
25640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25650 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
25660 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
25670 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
25680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25690 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
256a0 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
256b0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
256c0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
256d0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
256e0 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
256f0 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
25700 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
25710 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
25720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25730 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25740 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
25750 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
25760 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
25770 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
25780 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
25790 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
257a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
257b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
257c0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
257d0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
257e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
257f0 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69   OP_Next, pIn->i
25800 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
25810 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Top);.        sq
25820 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
25830 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
25840 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
25850 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
25860 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
25870 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
25880 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25890 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
258a0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
258b0 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
258c0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
258d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
258e0 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
258f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25900 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
25910 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
25920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25930 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
25940 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
25950 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
25960 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76 65         || (pLeve
25970 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25980 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
25990 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
259a0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
259b0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
259c0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  DX_ONLY)==0 ){. 
259d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
259e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
259f0 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
25a00 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
25a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25a20 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  f( pLevel->iIdxC
25a30 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ur>=0 ){.       
25a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25a50 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
25a60 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
25a70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
25a80 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
25a90 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20  ==OP_Return ){. 
25aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
25ac0 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  osub, pLevel->p1
25ad0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69  , pLevel->addrFi
25ae0 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rst);.      }els
25af0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
25b00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25b10 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
25b20 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
25b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
25b40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
25b50 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
25b60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
25b70 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
25b80 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
25b90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
25ba0 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
25bb0 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
25bc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25bd0 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
25be0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
25bf0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
25c00 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
25c10 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
25c20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
25c30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25c40 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
25c50 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =1 || pWInfo->nL
25c60 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  evel==pTabList->
25c70 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nSrc );.  for(i=
25c80 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
25c90 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  ->a; i<pWInfo->n
25ca0 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65 76  Level; i++, pLev
25cb0 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63  el++){.    struc
25cc0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25cd0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
25ce0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
25cf0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c  iFrom];.    Tabl
25d00 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
25d10 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
25d20 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
25d30 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
25d40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
25d50 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
25d60 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
25d70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
25d80 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
25d90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
25da0 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20  T_CLOSE)==0 ){. 
25db0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
25dc0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28  ->okOnePass && (
25dd0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25de0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
25df0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
25e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25e10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
25e20 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
25e30 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
25e40 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
25e50 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25e60 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
25e70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
25e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
25e90 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
25ea0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a  evel->iIdxCur);.
25eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25ec0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
25ed0 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
25ee0 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
25ef0 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
25f00 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
25f10 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
25f20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
25f30 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
25f40 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
25f50 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
25f60 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
25f70 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
25f80 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
25f90 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
25fa0 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
25fb0 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
25fc0 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
25fd0 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
25fe0 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
25ff0 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
26000 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
26010 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
26020 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
26030 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
26040 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
26050 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
26060 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
26070 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
26080 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
26090 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
260a0 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
260b0 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
260c0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
260d0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
260e0 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
260f0 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
26100 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
26110 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
26120 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
26130 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
26140 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
26150 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
26160 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
26170 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
26180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4c    */.    if( (pL
26190 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
261a0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
261b0 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d 3e 6d  ED)!=0 && !db->m
261c0 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20 20  allocFailed){.  
261d0 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
261e0 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
261f0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
26200 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
26210 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
26220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26230 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
26240 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
26250 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
26260 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
26270 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
26280 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26290 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49  .      for(k=pWI
262a0 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73  nfo->iTop; k<las
262b0 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; k++, pOp++){.
262c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
262d0 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
262e0 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
262f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
26300 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
26310 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
26320 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
26330 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
26340 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26350 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
26360 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
26380 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
26390 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
263a0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
263b0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
263c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
263d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
263e0 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
263f0 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  rt( (pLevel->pla
26400 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
26410 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
26430 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
26440 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
26450 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
26460 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
26470 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
26480 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
26490 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
264a0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
264b0 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
264c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
264d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  .  }..  /* Final
264e0 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20   cleanup.  */.  
264f0 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62  whereInfoFree(db
26500 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  , pWInfo);.  ret
26510 75 72 6e 3b 0a 7d 0a                             urn;.}.