/ Hex Artifact Content
Login

Artifact 34c733f9e8ca5e8f611958422e7cc236bc9cf739:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0350: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0370: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0380: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
0390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72  .int sqlite3Wher
03a0: 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  eTrace = 0;.#end
03b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
03c0: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
03d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
03e0: 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57 48  BUG).# define WH
03f0: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0400: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0410: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0420: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
0430: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0440: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
0450: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
0460: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
0470: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
0480: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0490: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
04a0: 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d 61  eMaskSet WhereMa
04b0: 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20 73  skSet;.typedef s
04c0: 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66  truct WhereOrInf
04d0: 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a 74  o WhereOrInfo;.t
04e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04f0: 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72 65  ereAndInfo Where
0500: 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  AndInfo;.typedef
0510: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 73   struct WhereCos
0520: 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a  t WhereCost;../*
0530: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0540: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
0550: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
0560: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
0570: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
0580: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
0590: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
05a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
05b0: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
05c0: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
05d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
05e0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
05f0: 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72 61  ers by AND opera
0600: 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79  tors,.** usually
0610: 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20 73  , or sometimes s
0620: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73 65  ubexpressions se
0630: 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a  parated by OR..*
0640: 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54 65  *.** All WhereTe
0650: 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  rms are collecte
0660: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
0670: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
0680: 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20  cture.  .** The 
0690: 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69  following identi
06a0: 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ty holds:.**.** 
06b0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
06c0: 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65 72  .pWC->a[WhereTer
06d0: 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65 54  m.idx] == WhereT
06e0: 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  erm.**.** When a
06f0: 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65 20   term is of the 
0700: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
0710: 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e 20           X <op> 
0720: 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <expr>.**.** whe
0730: 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re X is a column
0740: 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69   name and <op> i
0750: 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69 6e  s one of certain
0760: 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74   operators,.** t
0770: 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  hen WhereTerm.le
0780: 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68 65  ftCursor and Whe
0790: 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c  reTerm.u.leftCol
07a0: 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a  umn record the.*
07b0: 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * cursor number 
07c0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  and column numbe
07d0: 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54  r for X.  WhereT
07e0: 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72 65  erm.eOperator re
07f0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70  cords.** the <op
0800: 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73  > using a bitmas
0810: 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e  k encoding defin
0820: 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c  ed by WO_xxx bel
0830: 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20  ow.  The.** use 
0840: 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63  of a bitmask enc
0850: 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70  oding for the op
0860: 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73  erator allows us
0870: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75   to search.** qu
0880: 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20  ickly for terms 
0890: 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f  that match any o
08a0: 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  f several differ
08b0: 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ent operators..*
08c0: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72 6d  *.** A WhereTerm
08d0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 74   might also be t
08e0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 65  wo or more subte
08f0: 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
0900: 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   OR:.**.**      
0910: 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65     (t1.X <op> <e
0920: 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c  xpr>) OR (t1.Y <
0930: 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e  op> <expr>) OR .
0940: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ....**.** In thi
0950: 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20 77  s second case, w
0960: 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45 52  tFlag as the TER
0970: 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e 64  M_ORINFO set and
0980: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f   eOperator==WO_O
0990: 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65  R.** and the Whe
09a0: 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f  reTerm.u.pOrInfo
09b0: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f   field points to
09c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
09d0: 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69  mation that.** i
09e0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75  s collected abou
09f0: 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61  t the.**.** If a
0a00: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
0a10: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
0a20: 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  ot match either 
0a30: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  of the two previ
0a40: 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65  ous.** categorie
0a50: 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74 6f  s, then eOperato
0a60: 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72 65  r==0.  The Where
0a70: 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c 64  Term.pExpr field
0a80: 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a   is still set.**
0a90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0aa0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 63   subexpression c
0ab0: 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c 61  ontent and wtFla
0ac0: 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70 70  gs is set up app
0ad0: 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75  ropriately.** bu
0ae0: 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c 64  t no other field
0af0: 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54 65  s in the WhereTe
0b00: 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d 65  rm object are me
0b10: 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20  aningful..**.** 
0b20: 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d  When eOperator!=
0b30: 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20 61  0, prereqRight a
0b40: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0b50: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0b60: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0b70: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0b80: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0b90: 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  gle WhereMaskSet
0ba0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0bb0: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0bc0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0bd0: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
0be0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
0bf0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
0c00: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
0c10: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
0c20: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
0c30: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0c40: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0c50: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0c60: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0c70: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0c80: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0c90: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0ca0: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0cb0: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0cc0: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0cd0: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
0ce0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
0cf0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
0d00: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57 68   and 45.  The Wh
0d10: 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72  ereMaskSet.** tr
0d20: 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73  anslates these s
0d30: 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  parse cursor num
0d40: 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63  bers into consec
0d50: 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a  utive integers.*
0d60: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  * beginning with
0d70: 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d   0 in order to m
0d80: 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73  ake the best pos
0d90: 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65  sible use of the
0da0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69   available.** bi
0db0: 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73  ts in the Bitmas
0dc0: 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65  k.  So, in the e
0dd0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68  xample above, th
0de0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
0df0: 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70  .** would be map
0e00: 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72  ped into integer
0e10: 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a  s 0 through 7..*
0e20: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
0e30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f  of terms in a jo
0e40: 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  in is limited by
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
0e60: 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71  its.** in prereq
0e70: 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71  Right and prereq
0e80: 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75 6c  All.  The defaul
0e90: 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68 65  t is 64 bits, he
0ea0: 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73  nce SQLite.** is
0eb0: 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70 72   only able to pr
0ec0: 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74 68  ocess joins with
0ed0: 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61 62   64 or fewer tab
0ee0: 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  les..*/.typedef 
0ef0: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0f00: 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75   WhereTerm;.stru
0f10: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
0f20: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
0f40: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
0f50: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
0f60: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
0f70: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
0f80: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
0f90: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
0fa0: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
0fb0: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
0fc0: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
0fe0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
0ff0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
1000: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
1010: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
1020: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
1030: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
1040: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
1050: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
1060: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
1070: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
1080: 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72 61  mation if eOpera
1090: 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20 20  tor==WO_OR */.  
10a0: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
10b0: 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74  pAndInfo; /* Ext
10c0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
10d0: 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  f eOperator==WO_
10e0: 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20  AND */.  } u;.  
10f0: 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  u16 eOperator;  
1100: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f          /* A WO_
1110: 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  xx value describ
1120: 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38  ing <op> */.  u8
1130: 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20   wtFlags;       
1140: 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78 78        /* TERM_xx
1150: 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53 65  x bit flags.  Se
1160: 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20  e below */.  u8 
1170: 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  nChild;         
1180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1190: 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20  f children that 
11a0: 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20  must disable us 
11b0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11c0: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20   *pWC;       /* 
11d0: 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20  The clause this 
11e0: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
11f0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
1200: 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20  reqRight;    /* 
1210: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
1220: 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72 2d  s used by pExpr-
1230: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
1240: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
1250: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
1260: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
1270: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f  nced by pExpr */
1280: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1290: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65  ed values of Whe
12a0: 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a 2a  reTerm.wtFlags.*
12b0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44  /.#define TERM_D
12c0: 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20  YNAMIC    0x01  
12d0: 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c   /* Need to call
12e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a 2f  te(db, pExpr) */
1300: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49  .#define TERM_VI
1310: 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20 20  RTUAL    0x02   
1320: 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65 20  /* Added by the 
1330: 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e  optimizer.  Do n
1340: 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69  ot code */.#defi
1350: 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20  ne TERM_CODED   
1360: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69     0x04   /* Thi
1370: 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64  s term is alread
1380: 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69  y coded */.#defi
1390: 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20  ne TERM_COPIED  
13a0: 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73     0x08   /* Has
13b0: 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66   a child */.#def
13c0: 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20  ine TERM_ORINFO 
13d0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e 65      0x10   /* Ne
13e0: 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20 57  ed to free the W
13f0: 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e  hereTerm.u.pOrIn
1400: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64 65  fo object */.#de
1410: 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e 46  fine TERM_ANDINF
1420: 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20 4e  O    0x20   /* N
1430: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1440: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e 64  WhereTerm.u.pAnd
1450: 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65 66  Info obj */.#def
1460: 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20  ine TERM_OR_OK  
1470: 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55 73      0x40   /* Us
1480: 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61  ed during OR-cla
1490: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  use processing *
14a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
14b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
14c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
14d0: 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d  holds all inform
14e0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a  ation about a.**
14f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1500: 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61  Mostly this is a
1510: 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f   container for o
1520: 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65  ne or more Where
1530: 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  Terms..*/.struct
1540: 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20   WhereClause {. 
1550: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1570: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1580: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
1590: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f 2a  t *pMaskSet;  /*
15a0: 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c   Mapping of tabl
15b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
15c0: 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a   to bitmasks */.
15d0: 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b 3b    Bitmask vmask;
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
15f0: 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69 6e  tmask identifyin
1600: 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  g virtual table 
1610: 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38 20  cursors */.  u8 
1620: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1630: 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f        /* Split o
1640: 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44  perator.  TK_AND
1650: 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69   or TK_OR */.  i
1660: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
1670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1680: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1690: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
16a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16c0: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
16d0: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
16e0: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
16f0: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1700: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1710: 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ase */.#if defin
1720: 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f  ed(SQLITE_SMALL_
1730: 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54 65  STACK).  WhereTe
1740: 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20 20  rm aStatic[1];  
1750: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
1760: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
1770: 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65  ] */.#else.  Whe
1780: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 38  reTerm aStatic[8
1790: 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ];    /* Initial
17a0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
17b0: 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a  r a[] */.#endif.
17c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72  };../*.** A Wher
17d0: 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72  eTerm with eOper
17e0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20  ator==WO_OR has 
17f0: 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f  its u.pOrInfo po
1800: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1810: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1820: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1830: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1840: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1850: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
1860: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
1870: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
1880: 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
1890: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
18a0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
18b0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  xable;       /* 
18c0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69  Bitmask of all i
18d0: 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73 20  ndexable tables 
18e0: 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f  in the clause */
18f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1900: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1910: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61  rator==WO_AND ha
1920: 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f  s its u.pAndInfo
1930: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
1940: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
1950: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
1960: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1970: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1980: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 41  */.struct WhereA
1990: 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65  ndInfo {.  Where
19a0: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65 78      /* The subex
19c0: 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20  pression broken 
19d0: 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  out */.};../*.**
19e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
19f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1a00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74 72  ructure keeps tr
1a10: 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67  ack of a mapping
1a20: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45  .** between VDBE
1a30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1a40: 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65 20  and bits of the 
1a50: 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72  bitmasks in Wher
1a60: 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
1a70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1a80: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
1a90: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
1aa0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
1ab0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
1ac0: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
1ad0: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
1ae0: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
1af0: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
1b00: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
1b10: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
1b20: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
1b30: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
1b40: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
1b50: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
1b60: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
1b70: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
1b80: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
1b90: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
1ba0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
1bb0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1bc0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1bd0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1be0: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1bf0: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1c00: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1c10: 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d 61  **.** If WhereMa
1c20: 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69  skSet.ix[A]==B i
1c30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65  t means that The
1c40: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42   A-th bit of a B
1c50: 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  itmask.** corres
1c60: 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f  ponds VDBE curso
1c70: 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65  r number B.  The
1c80: 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62   A-th bit of a b
1c90: 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a  itmask is 1<<A..
1ca0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1cb0: 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20  e, if the WHERE 
1cc0: 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
1cd0: 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42  n used these VDB
1ce0: 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34  E.** cursors:  4
1cf0: 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20  , 5, 8, 29, 57, 
1d00: 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 57  73.  Then the  W
1d10: 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
1d20: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1d30: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1d40: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1d50: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1d60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1d70: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1d80: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1d90: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
1da0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
1db0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
1dc0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
1dd0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
1de0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
1df0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1e00: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1e10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1e20: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1e30: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1e40: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1e50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1e60: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1e70: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1e80: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1e90: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
1ea0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
1eb0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
1ec0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
1ed0: 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  ct WhereMaskSet 
1ee0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1f10: 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76  ssigned cursor v
1f20: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  alues */.  int i
1f30: 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 20  x[BMS];         
1f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f50: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  or assigned to e
1f60: 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f  ach bit */.};../
1f70: 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73 74  *.** A WhereCost
1f80: 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73 20   object records 
1f90: 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65 67  a lookup strateg
1fa0: 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d 61  y and the estima
1fb0: 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70  ted.** cost of p
1fc0: 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74 72  ursuing that str
1fd0: 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  ategy..*/.struct
1fe0: 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20 57   WhereCost {.  W
1ff0: 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20  herePlan plan;  
2000: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
2010: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f  strategy */.  do
2020: 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20 20  uble rCost;     
2030: 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74   /* Overall cost
2040: 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68 69   of pursuing thi
2050: 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65 67  s search strateg
2060: 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  y */.  double nR
2070: 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74  ow;       /* Est
2080: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
2090: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
20a0: 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 3b 20    Bitmask used; 
20b0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
20c0: 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  of cursors used 
20d0: 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f 0a  by this plan */.
20e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73  };../*.** Bitmas
20f0: 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ks for the opera
2100: 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63 65  tors that indice
2110: 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78  s are able to ex
2120: 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52  ploit.  An.** OR
2130: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
2140: 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  of these values 
2150: 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
2160: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a   searching for.*
2170: 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  * terms in the w
2180: 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  here clause..*/.
2190: 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20  #define WO_IN   
21a0: 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65 20    0x001.#define 
21b0: 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32 0a  WO_EQ     0x002.
21c0: 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20  #define WO_LT   
21d0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54    (WO_EQ<<(TK_LT
21e0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
21f0: 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45   WO_LE     (WO_E
2200: 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29  Q<<(TK_LE-TK_EQ)
2210: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20  ).#define WO_GT 
2220: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2230: 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  GT-TK_EQ)).#defi
2240: 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f  ne WO_GE     (WO
2250: 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45  _EQ<<(TK_GE-TK_E
2260: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d  Q)).#define WO_M
2270: 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65 66  ATCH  0x040.#def
2280: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30 78  ine WO_ISNULL 0x
2290: 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4f  080.#define WO_O
22a0: 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20 20  R     0x100     
22b0: 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65    /* Two or more
22c0: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
22d0: 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  rms */.#define W
22e0: 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20 20  O_AND    0x200  
22f0: 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d       /* Two or m
2300: 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  ore AND-connecte
2310: 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65 66  d terms */..#def
2320: 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78  ine WO_ALL    0x
2330: 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  fff       /* Mas
2340: 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c  k of all possibl
2350: 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  e WO_* values */
2360: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47  .#define WO_SING
2370: 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f  LE 0x0ff       /
2380: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f  * Mask of all no
2390: 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20  n-compound WO_* 
23a0: 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  values */../*.**
23b0: 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61   Value for wsFla
23c0: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
23d0: 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73  estIndex() and s
23e0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72  tored in.** Wher
23f0: 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20  eLevel.wsFlags. 
2400: 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74   These flags det
2410: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61  ermine which sea
2420: 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65  rch.** strategie
2430: 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
2440: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61  e..**.** The lea
2450: 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31  st significant 1
2460: 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76  2 bits is reserv
2470: 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72  ed as a mask for
2480: 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76   WO_ values abov
2490: 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c  e..** The WhereL
24a0: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
24b0: 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65  ld is usually se
24c0: 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51  t to WO_IN|WO_EQ
24d0: 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42  |WO_ISNULL..** B
24e0: 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ut if the table 
24f0: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
2500: 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  le of a left joi
2510: 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73  n, WhereLevel.ws
2520: 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  Flags.** is set 
2530: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
2540: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
2550: 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61  wsFlags field ca
2560: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61  n then be used a
2570: 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61  s.** the "op" pa
2580: 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54  rameter to findT
2590: 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20  erm when we are 
25a0: 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69  resolving equali
25b0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
25c0: 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72  ** ISNULL constr
25d0: 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20  aints will then 
25e0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74  not be used on t
25f0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
2600: 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e  f a left.** join
2610: 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37  .  Tickets #2177
2620: 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23   and #2189..*/.#
2630: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57  define WHERE_ROW
2640: 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30  ID_EQ     0x0000
2650: 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45  1000  /* rowid=E
2660: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
2670: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
2680: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2690: 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20  GE  0x00002000  
26a0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
26b0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
26d0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
26e0: 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45  00010000  /* x=E
26f0: 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e  XPR or x IN (...
2700: 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a  ) or x IS NULL *
2710: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2720: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30  COLUMN_RANGE 0x0
2730: 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0020000  /* x<EX
2740: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
2750: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2760: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
2770: 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20  x00040000  /* x 
2780: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
2790: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
27a0: 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30  _NULL  0x0008000
27b0: 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20  0  /* x IS NULL 
27c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
27d0: 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78  _INDEXED      0x
27e0: 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79  000f0000  /* Any
27f0: 74 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20  thing that uses 
2800: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66  an index */.#def
2810: 69 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  ine WHERE_NOT_FU
2820: 4c 4c 53 43 41 4e 20 30 78 30 30 30 66 33 30 30  LLSCAN 0x000f300
2830: 30 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64  0  /* Does not d
2840: 6f 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  o a full table s
2850: 63 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  can */.#define W
2860: 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20  HERE_IN_ABLE    
2870: 20 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a    0x000f1000  /*
2880: 20 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74   Able to support
2890: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
28a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
28b0: 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78  _TOP_LIMIT    0x
28c0: 30 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45  00100000  /* x<E
28d0: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
28e0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
28f0: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
2900: 49 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30  IMIT    0x002000
2910: 30 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  00  /* x>EXPR or
2920: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
2930: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
2940: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
2950: 20 20 30 78 30 30 38 30 30 30 30 30 20 20 2f 2a    0x00800000  /*
2960: 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20   Use index only 
2970: 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a  - omit table */.
2980: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52  #define WHERE_OR
2990: 44 45 52 42 59 20 20 20 20 20 20 30 78 30 31 30  DERBY      0x010
29a0: 30 30 30 30 30 20 20 2f 2a 20 4f 75 74 70 75 74  00000  /* Output
29b0: 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20   will appear in 
29c0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f  correct order */
29d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
29e0: 45 56 45 52 53 45 20 20 20 20 20 20 30 78 30 32  EVERSE      0x02
29f0: 30 30 30 30 30 30 20 20 2f 2a 20 53 63 61 6e 20  000000  /* Scan 
2a00: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
2a10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2a20: 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30  E_UNIQUE       0
2a30: 78 30 34 30 30 30 30 30 30 20 20 2f 2a 20 53 65  x04000000  /* Se
2a40: 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68  lects no more th
2a50: 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64  an one row */.#d
2a60: 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54  efine WHERE_VIRT
2a70: 55 41 4c 54 41 42 4c 45 20 30 78 30 38 30 30 30  UALTABLE 0x08000
2a80: 30 30 30 20 20 2f 2a 20 55 73 65 20 76 69 72 74  000  /* Use virt
2a90: 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73  ual-table proces
2aa0: 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  sing */.#define 
2ab0: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
2ac0: 20 20 20 30 78 31 30 30 30 30 30 30 30 20 20 2f     0x10000000  /
2ad0: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
2ae0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
2af0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 45 4d  define WHERE_TEM
2b00: 50 5f 49 4e 44 45 58 20 20 20 30 78 32 30 30 30  P_INDEX   0x2000
2b10: 30 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  0000  /* Uses an
2b20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2b30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   */../*.** Initi
2b40: 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63  alize a prealloc
2b50: 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65  ated WhereClause
2b60: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2b70: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2b80: 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68  ClauseInit(.  Wh
2b90: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
2bb0: 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20  ereClause to be 
2bc0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
2bd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bf0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2c00: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
2c10: 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 2f  et *pMaskSet   /
2c20: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
2c30: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
2c40: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
2c50: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  */.){.  pWC->pPa
2c60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2c70: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20  pWC->pMaskSet = 
2c80: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d  pMaskSet;.  pWC-
2c90: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
2ca0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79  C->nSlot = Array
2cb0: 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69  Size(pWC->aStati
2cc0: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
2cd0: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20 70  WC->aStatic;.  p
2ce0: 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a 7d  WC->vmask = 0;.}
2cf0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
2d00: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
2d10: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2d20: 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75  eClear(WhereClau
2d30: 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  se*);../*.** Dea
2d40: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f  llocate all memo
2d50: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2d60: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f  th a WhereOrInfo
2d70: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2d80: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49  ic void whereOrI
2d90: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65  nfoDelete(sqlite
2da0: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e  3 *db, WhereOrIn
2db0: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
2dc0: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
2dd0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
2de0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2df0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2e00: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
2e10: 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68 65  iated with a Whe
2e20: 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63 74  reAndInfo object
2e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e40: 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c   whereAndInfoDel
2e50: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
2e60: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2e70: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
2e80: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
2e90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2ea0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
2eb0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65  Deallocate a Whe
2ec0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2ed0: 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  re.  The WhereCl
2ee0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2ef0: 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20  * itself is not 
2f00: 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75  freed.  This rou
2f10: 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65  tine is the inve
2f20: 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75  rse of whereClau
2f30: 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  seInit()..*/.sta
2f40: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
2f50: 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43  auseClear(WhereC
2f60: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
2f70: 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72  nt i;.  WhereTer
2f80: 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20  m *a;.  sqlite3 
2f90: 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  *db = pWC->pPars
2fa0: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70  e->db;.  for(i=p
2fb0: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2fc0: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2fd0: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2fe0: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  a->wtFlags & TER
2ff0: 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  M_DYNAMIC ){.   
3000: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3010: 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70  lete(db, a->pExp
3020: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
3030: 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  ( a->wtFlags & T
3040: 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20  ERM_ORINFO ){.  
3050: 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44      whereOrInfoD
3060: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70  elete(db, a->u.p
3070: 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c  OrInfo);.    }el
3080: 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67  se if( a->wtFlag
3090: 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  s & TERM_ANDINFO
30a0: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41   ){.      whereA
30b0: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c  ndInfoDelete(db,
30c0: 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b   a->u.pAndInfo);
30d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30e0: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
30f0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
3100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3110: 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  WC->a);.  }.}../
3120: 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
3130: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
3140: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68 65  entry to the Whe
3150: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
3160: 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  pWC..** The new 
3170: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
3180: 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
3190: 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64 20  from Expr p and 
31a0: 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a  with wtFlags..**
31b0: 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70 57   The index in pW
31c0: 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65  C->a[] of the ne
31d0: 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20 72  w WhereTerm is r
31e0: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
31f0: 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74 75  ss..** 0 is retu
3200: 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  rned if the new 
3210: 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64 20  WhereTerm could 
3220: 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75 65  not be added due
3230: 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20   to a memory.** 
3240: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3250: 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c  .  The memory al
3260: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
3270: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65   will be recorde
3280: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e  d in.** the db->
3290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
32a0: 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65 72  g so that higher
32b0: 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73  -level functions
32c0: 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e 0a   can detect it..
32d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
32e0: 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ne will increase
32f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3300: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20   pWC->a[] array 
3310: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
3320: 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c 61  .** If the wtFla
3330: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
3340: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
3350: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
3360: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
3370: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
3380: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
3390: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
33a0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
33b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75 65  .** This is true
33c0: 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72 6f   even if this ro
33d0: 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20 61  utine fails to a
33e0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
33f0: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57  ereTerm..**.** W
3400: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
3410: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
3420: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
3430: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
3440: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
3450: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
3460: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
3470: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
3480: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
3490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
34a0: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
34b0: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
34c0: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
34d0: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
34e0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
34f0: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
3500: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
3510: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3520: 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29 7b  *p, u8 wtFlags){
3530: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
3540: 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  erm;.  int idx;.
3550: 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46 6c    testcase( wtFl
3560: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
3570: 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  AL );  /* EV: R-
3580: 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a 20  00211-15100 */. 
3590: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
35a0: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
35b0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
35c0: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
35d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
35e0: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  WC->pParse->db;.
35f0: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
3600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
3610: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
3620: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
3630: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
3640: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
3650: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
3660: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
3670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
3680: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
3690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
36a0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
36b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
36c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
36d0: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
36e0: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
36f0: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
3700: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
3710: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
3720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3730: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
3740: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
3750: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
3760: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
3770: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
3780: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
3790: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
37a0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
37b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pTerm->pExpr = p
37c0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
37d0: 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20  gs = wtFlags;.  
37e0: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
37f0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
3800: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
3810: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
3820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
3830: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
3840: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
3850: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
3860: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
3870: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
3880: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
3890: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
38a0: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
38b0: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
38c0: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
38d0: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
38e0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
38f0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
3900: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
3910: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
3920: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
3930: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
3940: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
3950: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
3960: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
3970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
3980: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
3990: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
39a0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
39b0: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
39c0: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
39d0: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
39f0: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
3a00: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
3a10: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
3a20: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
3a30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3a40: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
3a50: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
3a60: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
3a70: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
3a80: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
3a90: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
3aa0: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
3ab0: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
3ac0: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
3ad0: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
3ae0: 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d 20  ay.  The slot[] 
3af0: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
3b00: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
3b10: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
3b20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3b40: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
3b50: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
3b60: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
3b70: 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  op){.  pWC->op =
3b80: 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20 70   (u8)op;.  if( p
3b90: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
3ba0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
3bb0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65  p!=op ){.    whe
3bc0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
3bd0: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  WC, pExpr, 0);. 
3be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72   }else{.    wher
3bf0: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
3c00: 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20  r->pLeft, op);. 
3c10: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
3c20: 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  C, pExpr->pRight
3c30: 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , op);.  }.}../*
3c40: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
3c50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  n expression mas
3c60: 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d 61  k set (a WhereMa
3c70: 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a 2f  skSet object).*/
3c80: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
3c90: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
3ca0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
3cb0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
3cc0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
3cd0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
3ce0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
3cf0: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
3d00: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
3d10: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
3d20: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57 68  tmask getMask(Wh
3d30: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
3d40: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
3d50: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
3d60: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
3d70: 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61  >n<=sizeof(Bitma
3d80: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
3d90: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
3da0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
3db0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
3dc0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
3dd0: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
3de0: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
3df0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3e10: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
3e20: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
3e30: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
3e40: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
3e50: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
3e60: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
3e70: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
3e80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3e90: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
3ea0: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
3eb0: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
3ec0: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
3ed0: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
3ee0: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
3ef0: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
3f00: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
3f10: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
3f20: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
3f30: 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a  k(WhereMaskSet *
3f40: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
3f50: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
3f60: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
3f70: 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53  ArraySize(pMaskS
3f80: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
3f90: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
3fa0: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
3fb0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
3fc0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
3fd0: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
3fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3ff0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a   and generates.*
4000: 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  * a bitmask indi
4010: 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62  cating which tab
4020: 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  les are used in 
4030: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  that expression.
4040: 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  ** tree..**.** I
4050: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
4060: 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b   routine to work
4070: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
4080: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
4090: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69  .** previously i
40a0: 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52 65  nvoked sqlite3Re
40b0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
40c0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
40d0: 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  on.  See.** the 
40e0: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
40f0: 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
4100: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
4110: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  formation..** Th
4120: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  e sqlite3Resolve
4130: 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75 74  ExprNames() rout
4140: 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63  ines looks for c
4150: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a  olumn names and.
4160: 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70  ** sets their op
4170: 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55  codes to TK_COLU
4180: 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70  MN and their Exp
4190: 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20  r.iTable fields 
41a0: 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63  to.** the VDBE c
41b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
41c0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
41d0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
41e0: 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  s to.** translat
41f0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
4200: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73  bers into bitmas
4210: 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20  k values and OR 
4220: 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61  all.** the bitma
4230: 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f  sks together..*/
4240: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4250: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
4260: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4270: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
4280: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
4290: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
42a0: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
42b0: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
42c0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
42d0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
42e0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
42f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
4300: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
4310: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4320: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
4330: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
4340: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
4350: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
4360: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
4370: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
4380: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
4390: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
43a0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
43b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
43c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
43d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
43e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
43f0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
4400: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
4410: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
4420: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
4430: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
4440: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
4450: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
4460: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4470: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
4480: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
4490: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
44a0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
44b0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
44c0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
44d0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
44e0: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
44f0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
4500: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
4510: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
4520: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4530: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
4540: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4550: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
4560: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
4570: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4580: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4590: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
45a0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
45b0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
45c0: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
45d0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
45e0: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
45f0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
4600: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
4610: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69  askSet, pS->pELi
4620: 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  st);.    mask |=
4630: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4640: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4650: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
4660: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
4670: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
4680: 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72  kSet, pS->pOrder
4690: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
46a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57  pMaskSet, pS->pW
46c0: 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20  here);.    mask 
46d0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
46e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
46f0: 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53  pHaving);.    pS
4700: 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20   = pS->pPrior;. 
4710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4730: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
4740: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ven operator is 
4750: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  one of the opera
4760: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20  tors that is.** 
4770: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69  allowed for an i
4780: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63  ndexable WHERE c
4790: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65  lause term.  The
47a0: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f   allowed operato
47b0: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22  rs are.** "=", "
47c0: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22  <", ">", "<=", "
47d0: 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a  >=", and "IN"..*
47e0: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
47f0: 49 4f 4e 2d 4f 46 3a 20 52 2d 35 39 39 32 36 2d  ION-OF: R-59926-
4800: 32 36 33 39 33 20 54 6f 20 62 65 20 75 73 61 62  26393 To be usab
4810: 6c 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 61  le by an index a
4820: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 0a 2a 2a   term must be.**
4830: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
4840: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 20  ollowing forms: 
4850: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 65 73 73  column = express
4860: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3e 20 65 78 70  ion column > exp
4870: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d  ression.** colum
4880: 6e 20 3e 3d 20 65 78 70 72 65 73 73 69 6f 6e 20  n >= expression 
4890: 63 6f 6c 75 6d 6e 20 3c 20 65 78 70 72 65 73 73  column < express
48a0: 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 3d 20 65 78  ion column <= ex
48b0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 78 70 72  pression.** expr
48c0: 65 73 73 69 6f 6e 20 3d 20 63 6f 6c 75 6d 6e 20  ession = column 
48d0: 65 78 70 72 65 73 73 69 6f 6e 20 3e 20 63 6f 6c  expression > col
48e0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 3e  umn expression >
48f0: 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 65 78 70 72  = column.** expr
4900: 65 73 73 69 6f 6e 20 3c 20 63 6f 6c 75 6d 6e 20  ession < column 
4910: 65 78 70 72 65 73 73 69 6f 6e 20 3c 3d 20 63 6f  expression <= co
4920: 6c 75 6d 6e 20 63 6f 6c 75 6d 6e 20 49 4e 0a 2a  lumn column IN.*
4930: 2a 20 28 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  * (expression-li
4940: 73 74 29 20 63 6f 6c 75 6d 6e 20 49 4e 20 28 73  st) column IN (s
4950: 75 62 71 75 65 72 79 29 20 63 6f 6c 75 6d 6e 20  ubquery) column 
4960: 49 53 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  IS NULL.*/.stati
4970: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
4980: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
4990: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
49a0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
49b0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
49c0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
49d0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
49e0: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
49f0: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
4a00: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
4a10: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
4a20: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
4a30: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
4a40: 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f   op<=TK_GE) || o
4a50: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a  p==TK_ISNULL;.}.
4a60: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
4a70: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
4a80: 54 59 50 45 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  TYPE..*/.#define
4a90: 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20   SWAP(TYPE,A,B) 
4aa0: 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20  {TYPE t=A; A=B; 
4ab0: 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  B=t;}../*.** Com
4ac0: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
4ad0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
4ae0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
4af0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
4b00: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
4b10: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
4b20: 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69  .** If a collati
4b30: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  on sequence is a
4b40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
4b50: 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f  ither the left o
4b60: 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20  r right.** side 
4b70: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4b80: 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73  n, it remains as
4b90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4ba0: 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65  e same side afte
4bb0: 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61  r.** the commuta
4bc0: 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c  tion. So "Y coll
4bd0: 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22  ate NOCASE op X"
4be0: 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20   becomes .** "X 
4bf0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
4c00: 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65  p Y". This is be
4c10: 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74  cause any collat
4c20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a  ion sequence on.
4c30: 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  ** the left hand
4c40: 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61   side of a compa
4c50: 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  rison overrides 
4c60: 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
4c70: 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63  quence .** attac
4c80: 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  hed to the right
4c90: 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72  . For the same r
4ca0: 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70  eason the EP_Exp
4cb0: 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20  Collate flag.** 
4cc0: 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e  is not commuted.
4cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ce0: 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73  exprCommute(Pars
4cf0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
4d00: 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65  *pExpr){.  u16 e
4d10: 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72  xpRight = (pExpr
4d20: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4d30: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4d40: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
4d50: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
4d60: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
4d70: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
4d80: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
4d90: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
4da0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
4db0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
4dc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
4dd0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
4de0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
4df0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
4e00: 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  t->pColl = sqlit
4e10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
4e20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
4e30: 66 74 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c  ft);.  SWAP(Coll
4e40: 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67  Seq*,pExpr->pRig
4e50: 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d  ht->pColl,pExpr-
4e60: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a  >pLeft->pColl);.
4e70: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d    pExpr->pRight-
4e80: 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d  >flags = (pExpr-
4e90: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
4ea0: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
4eb0: 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45   | expLeft;.  pE
4ec0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4ed0: 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  s = (pExpr->pLef
4ee0: 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45  t->flags & ~EP_E
4ef0: 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70  xpCollate) | exp
4f00: 52 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78  Right;.  SWAP(Ex
4f10: 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  pr*,pExpr->pRigh
4f20: 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  t,pExpr->pLeft);
4f30: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
4f40: 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61  >=TK_GT ){.    a
4f50: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b  ssert( TK_LT==TK
4f60: 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _GT+2 );.    ass
4f70: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c  ert( TK_GE==TK_L
4f80: 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  E+2 );.    asser
4f90: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29  t( TK_GT>TK_EQ )
4fa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4fb0: 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  _GT<TK_LE );.   
4fc0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4fd0: 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78  op>=TK_GT && pEx
4fe0: 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b  pr->op<=TK_GE );
4ff0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
5000: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f   ((pExpr->op-TK_
5010: 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20  GT)^2)+TK_GT;.  
5020: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  }.}../*.** Trans
5030: 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20  late from TK_xx 
5040: 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78  operator to WO_x
5050: 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74  x bitmask..*/.st
5060: 61 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f  atic u16 operato
5070: 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20  rMask(int op){. 
5080: 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74   u16 c;.  assert
5090: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
50a0: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
50b0: 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f  IN ){.    c = WO
50c0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _IN;.  }else if(
50d0: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
50e0: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e  {.    c = WO_ISN
50f0: 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
5100: 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51    assert( (WO_EQ
5110: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20  <<(op-TK_EQ)) < 
5120: 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20  0x7fff );.    c 
5130: 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28  = (u16)(WO_EQ<<(
5140: 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a  op-TK_EQ));.  }.
5150: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5160: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
5170: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
5180: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
5190: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
51a0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
51b0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
51c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
51d0: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
51e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
51f0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
5200: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
5210: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
5220: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
5230: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
5240: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
5250: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
5260: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
5270: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
5280: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
5290: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
52a0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
52b0: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
52c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
52d0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
52e0: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
52f0: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
5300: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
5310: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
5320: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
5330: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
5340: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
5350: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
5360: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
5370: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
5380: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
5390: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
53a0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
53b0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
53c0: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
53d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
53e0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
53f0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
5400: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
5410: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
5420: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
5430: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
5440: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
5450: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
5460: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
5470: 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20 20 20   u32 op,        
5480: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
5490: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
54a0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
54b0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
54c0: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
54d0: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
54e0: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
54f0: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
5500: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
5510: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
5520: 20 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   k;.  assert( iC
5530: 75 72 3e 3d 30 20 29 3b 0a 20 20 6f 70 20 26 3d  ur>=0 );.  op &=
5540: 20 57 4f 5f 41 4c 4c 3b 0a 20 20 66 6f 72 28 70   WO_ALL;.  for(p
5550: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
5560: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
5570: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
5580: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
5590: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
55a0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
55b0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
55c0: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
55d0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
55e0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
55f0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
5600: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f  m->eOperator & o
5610: 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  p)!=0.    ){.   
5620: 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 70     if( pIdx && p
5630: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
5640: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
5650: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
5660: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
5670: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
5680: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  pColl;.        c
5690: 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20  har idxaff;.    
56a0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
56b0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
56c0: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
56d0: 0a 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20  .        idxaff 
56e0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
56f0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
5700: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
5710: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
5720: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
5730: 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e  idxaff) ) contin
5740: 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ue;..        /* 
5750: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63  Figure out the c
5760: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
5770: 65 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  e required from 
5780: 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20  an index for.   
5790: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
57a0: 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69   useful for opti
57b0: 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f  mising expressio
57c0: 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73  n pX. Store this
57d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
57e0: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
57f0: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  oll..        */.
5800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5810: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
5820: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
5830: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
5840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5850: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
5860: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 61  ight);.        a
5870: 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20 70  ssert(pColl || p
5880: 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 0a 20  Parse->nErr);.. 
5890: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
58a0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
58b0: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
58c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
58d0: 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e  NEVER(j>=pIdx->n
58e0: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
58f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
5900: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
5910: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
5920: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
5930: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29  pIdx->azColl[j])
5940: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5950: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
5960: 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  n pTerm;.    }. 
5970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5980: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
5990: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
59a0: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
59b0: 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72  e(SrcList*, Wher
59c0: 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a  eClause*, int);.
59d0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72  ./*.** Call expr
59e0: 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74  Analyze on all t
59f0: 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20  erms in a WHERE 
5a00: 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a  clause.  .**.**.
5a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a20: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20  xprAnalyzeAll(. 
5a30: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
5a40: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65  st,       /* the
5a50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
5a60: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
5a70: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
5a80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
5a90: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
5aa0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
5ab0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
5ac0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5ad0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
5ae0: 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29  TabList, pWC, i)
5af0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5b00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5b10: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
5b20: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
5b30: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
5b40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
5b50: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
5b60: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
5b70: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
5b80: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
5b90: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
5ba0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
5bb0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
5bc0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
5bd0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
5be0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
5bf0: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
5c00: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
5c10: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
5c20: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
5c30: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
5c40: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
5c50: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
5c60: 6f 62 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ob(.  Parse *pPa
5c70: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
5c80: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5c90: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5ca0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
5cb0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
5cc0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
5cd0: 0a 20 20 45 78 70 72 20 2a 2a 70 70 50 72 65 66  .  Expr **ppPref
5ce0: 69 78 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ix,  /* Pointer 
5cf0: 74 6f 20 54 4b 5f 53 54 52 49 4e 47 20 65 78 70  to TK_STRING exp
5d00: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 70 61 74  ression with pat
5d10: 74 65 72 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20  tern prefix */. 
5d20: 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74   int *pisComplet
5d30: 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  e, /* True if th
5d40: 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20  e only wildcard 
5d50: 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74  is % in the last
5d60: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
5d70: 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20  int *pnoCase    
5d80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
5d90: 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61  ercase is equiva
5da0: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
5db0: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
5dc0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20  char *z = 0;    
5dd0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f       /* String o
5de0: 6e 20 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70  n RHS of LIKE op
5df0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
5e00: 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
5e10: 3b 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ;      /* Right 
5e20: 61 6e 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66  and left size of
5e30: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
5e40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
5e50: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
5e60: 2a 20 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e  * List of operan
5e70: 64 73 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f  ds to the LIKE o
5e80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
5e90: 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63          /* One c
5eb0: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20  haracter in z[] 
5ec0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  /* Number of non
5ef0: 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78  -wildcard prefix
5f00: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5f10: 20 63 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20   char wc[3];    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5f30: 69 6c 64 63 61 72 64 20 63 68 61 72 61 63 74 65  ildcard characte
5f40: 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
5f50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5f60: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
5f70: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73  onnection */.  s
5f80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
5f90: 61 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70  al = 0;.  int op
5fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fb0: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f       /* Opcode o
5fc0: 66 20 70 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69  f pRight */..  i
5fd0: 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b  f( !sqlite3IsLik
5fe0: 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  eFunction(db, pE
5ff0: 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63  xpr, pnoCase, wc
6000: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6010: 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  0;.  }.#ifdef SQ
6020: 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69 66  LITE_EBCDIC.  if
6030: 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65 74  ( *pnoCase ) ret
6040: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
6050: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
6060: 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 74 20  .pList;.  pLeft 
6070: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
6080: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
6090: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
60a0: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  || sqlite3ExprAf
60b0: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d 53  finity(pLeft)!=S
60c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
60d0: 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  {.    /* IMP: R-
60e0: 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65 20  02065-49465 The 
60f0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  left-hand side o
6100: 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47 4c  f the LIKE or GL
6110: 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  OB operator must
6120: 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 6e  .    ** be the n
6130: 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ame of an indexe
6140: 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54 45  d column with TE
6150: 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  XT affinity. */.
6160: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6170: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  }.  assert( pLef
6180: 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29  t->iColumn!=(-1)
6190: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 49   ); /* Because I
61a0: 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46 46  PK never has AFF
61b0: 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69 67  _TEXT */..  pRig
61c0: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
61d0: 2e 70 45 78 70 72 3b 0a 20 20 6f 70 20 3d 20 70  .pExpr;.  op = p
61e0: 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28  Right->op;.  if(
61f0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
6200: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 70 52 69   ){.    op = pRi
6210: 67 68 74 2d 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20  ght->op2;.  }.  
6220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
6230: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
6240: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
6250: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
6260: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
6270: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
6280: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
6290: 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
62a0: 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f  (pReprepare, iCo
62b0: 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  l, SQLITE_AFF_NO
62c0: 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61  NE);.    if( pVa
62d0: 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
62e0: 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53  ue_type(pVal)==S
62f0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
6300: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29      z = (char *)
6310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6320: 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  xt(pVal);.    }.
6330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6340: 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
6350: 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 20  ->pVdbe, iCol); 
6360: 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d  /* IMP: R-23257-
6370: 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 61 73 73  02778 */.    ass
6380: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
6390: 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20  =TK_VARIABLE || 
63a0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52  pRight->op==TK_R
63b0: 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c  EGISTER );.  }el
63c0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54  se if( op==TK_ST
63d0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20  RING ){.    z = 
63e0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
63f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 7b  ;.  }.  if( z ){
6400: 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  .    cnt = 0;.  
6410: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e    while( (c=z[cn
6420: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
6430: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
6440: 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20  & c!=wc[2] ){.  
6450: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d      cnt++;.    }
6460: 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20  .    if( cnt!=0 
6470: 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b 63 6e  && 255!=(u8)z[cn
6480: 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20 45 78  t-1] ){.      Ex
6490: 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20 20 20  pr *pPrefix;.   
64a0: 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20     *pisComplete 
64b0: 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  = c==wc[0] && z[
64c0: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20  cnt+1]==0;.     
64d0: 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74   pPrefix = sqlit
64e0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
64f0: 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20  RING, z);.      
6500: 69 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50  if( pPrefix ) pP
6510: 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  refix->u.zToken[
6520: 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cnt] = 0;.      
6530: 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65  *ppPrefix = pPre
6540: 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  fix;.      if( o
6550: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
6560: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
6570: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6580: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
6590: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
65a0: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
65b0: 75 6d 6e 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  umn); /* IMP: R-
65c0: 32 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20  23257-02778 */. 
65d0: 20 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43         if( *pisC
65e0: 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68  omplete && pRigh
65f0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29  t->u.zToken[1] )
6600: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
6610: 66 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65  f the rhs of the
6620: 20 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e   LIKE expression
6630: 20 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20   is a variable, 
6640: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
6650: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
6660: 75 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62  ue of the variab
6670: 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  le means there i
6680: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76  s no need to inv
6690: 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20  oke the LIKE.   
66a0: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
66b0: 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56  on, then no OP_V
66c0: 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  ariable will be 
66d0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f  added to the pro
66e0: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20  gram..          
66f0: 2a 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70  ** This causes p
6700: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20  roblems for the 
6710: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
6720: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20  ameter_name().  
6730: 20 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20          ** API. 
6740: 54 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68  To workaround th
6750: 65 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20  em, add a dummy 
6760: 4f 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65  OP_Variable here
6770: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a  ..          */ .
6780: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
6790: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
67a0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
67b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
67c0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
67d0: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31  arse, pRight, r1
67e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
67f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
6800: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
6810: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c  urrentAddr(v)-1,
6820: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
6830: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6840: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6850: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6860: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6870: 20 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20       z = 0;.    
6880: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
6890: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
68a0: 0a 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29  .  return (z!=0)
68b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
68c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
68d0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
68e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6900: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
6910: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
6920: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
6930: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
6940: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
6950: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
6960: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
6970: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
6980: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
6990: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
69a0: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
69b0: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
69c0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
69d0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
69e0: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
69f0: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
6a00: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
6a10: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
6a20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6a30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6a40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
6a50: 6d 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20  match")!=0 ){.  
6a60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6a70: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
6a80: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  >x.pList;.  if( 
6a90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
6aa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6ab0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
6ac0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
6ad0: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
6ae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6af0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
6b00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6b10: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6b20: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
6b30: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
6b40: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
6b50: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
6b60: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
6b70: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
6b80: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
6b90: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
6ba0: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
6bb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6bc0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
6bd0: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
6be0: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
6bf0: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
6c00: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
6c10: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
6c20: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
6c30: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
6c40: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
6c50: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
6c60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6c70: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
6c80: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
6c90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
6ca0: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41  UBQUERY)./*.** A
6cb0: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
6cc0: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
6cd0: 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f  wo or more OR-co
6ce0: 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65  nnected.** subte
6cf0: 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a  rms.  So in:.**.
6d00: 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45  **     ... WHERE
6d10: 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37    (a=5) AND (b=7
6d20: 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29   OR c=9 OR d=13)
6d30: 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20   AND (d=13).**  
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e          ^^^^^^^^
6d60: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a  ^^^^^^^^^^^^.**.
6d70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6d80: 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73  analyzes terms s
6d90: 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c  uch as the middl
6da0: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62  e term in the ab
6db0: 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20  ove example..** 
6dc0: 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  A WhereOrTerm ob
6dd0: 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64  ject is computed
6de0: 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f   and attached to
6df0: 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a   the term under.
6e00: 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67  ** analysis, reg
6e10: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
6e20: 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e  utcome of the an
6e30: 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a  alysis.  Hence:.
6e40: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  **.**     WhereT
6e50: 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d  erm.wtFlags   |=
6e60: 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a    TERM_ORINFO.**
6e70: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75       WhereTerm.u
6e80: 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64  .pOrInfo  =  a d
6e90: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
6ea0: 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d  ated WhereOrTerm
6eb0: 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68   object.**.** Th
6ec0: 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61  e term being ana
6ed0: 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20  lyzed must have 
6ee0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f  two or more of O
6ef0: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74  R-connected subt
6f00: 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c  erms..** A singl
6f10: 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20  e subterm might 
6f20: 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d  be a set of AND-
6f30: 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75  connected sub-su
6f40: 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70  bterms..** Examp
6f50: 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64  les of terms und
6f60: 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a  er analysis:.**.
6f70: 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74  **     (A)     t
6f80: 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78  1.x=t2.y OR t1.x
6f90: 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35  =t2.z OR t1.y=15
6fa0: 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a   OR t1.z=t3.a+5.
6fb0: 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78  **     (B)     x
6fc0: 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d  =expr1 OR expr2=
6fd0: 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20  x OR x=expr3.** 
6fe0: 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78      (C)     t1.x
6ff0: 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74  =t2.y OR (t1.x=t
7000: 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29  2.z AND t1.y=15)
7010: 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20  .**     (D)     
7020: 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31  x=expr1 OR (y>11
7030: 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20   AND y<22 AND z 
7040: 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a  LIKE '*hello*').
7050: 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28  **     (E)     (
7060: 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20  p.a=1 AND q.b=2 
7070: 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70  AND r.c=3) OR (p
7080: 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41  .x=4 AND q.y=5 A
7090: 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20  ND r.z=6).**.** 
70a0: 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66  CASE 1:.**.** If
70b0: 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61 72   all subterms ar
70c0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 54 2e  e of the form T.
70d0: 43 3d 65 78 70 72 20 66 6f 72 20 73 6f 6d 65 20  C=expr for some 
70e0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
70f0: 20 43 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74   C.** a single t
7100: 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77 6e  able T (as shown
7110: 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61 62   in example B ab
7120: 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74 65  ove) then create
7130: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
7140: 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 61  * term that is a
7150: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e 20  n equivalent IN 
7160: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20  expression.  In 
7170: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7180: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e  the term.** bein
7190: 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a  g analyzed is:.*
71a0: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78  *.**      x = ex
71b0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
71c0: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
71d0: 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65  3.**.** then cre
71e0: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
71f0: 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69 73  l term like this
7200: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  :.**.**      x I
7210: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
7220: 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45  xpr3).**.** CASE
7230: 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c   2:.**.** If all
7240: 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69 6e   subterms are in
7250: 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69 6e  dexable by a sin
7260: 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68 65  gle table T, the
7270: 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n set.**.**     
7280: 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61  WhereTerm.eOpera
7290: 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  tor             
72a0: 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20   =  WO_OR.**    
72b0: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72   WhereTerm.u.pOr
72c0: 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
72d0: 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72 20   |=  the cursor 
72e0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
72f0: 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65   T.**.** A subte
7300: 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c 65  rm is "indexable
7310: 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74 68  " if it is of th
7320: 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c  e form.** "T.C <
7330: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72  op> <expr>" wher
7340: 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d  e C is any colum
7350: 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e 64  n of table T and
7360: 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65   .** <op> is one
7370: 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c   of "=", "<", "<
7380: 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22  =", ">", ">=", "
7390: 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e  IS NULL", or "IN
73a0: 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  "..** A subterm 
73b0: 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c  is also indexabl
73c0: 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41 4e  e if it is an AN
73d0: 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  D of two or more
73e0: 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73 20  .** subsubterms 
73f0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
7400: 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61 62  which is indexab
7410: 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20 41  le.  Indexable A
7420: 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20  ND .** subterms 
7430: 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65 72  have their eOper
7440: 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f 41  ator set to WO_A
7450: 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76 65  ND and they have
7460: 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73  .** u.pAndInfo s
7470: 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  et to a dynamica
7480: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
7490: 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63  ereAndTerm objec
74a0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e  t..**.** From an
74b0: 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20 76  other point of v
74c0: 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65 22  iew, "indexable"
74d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
74e0: 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a  subterm could.**
74f0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20   potentially be 
7500: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
7510: 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70 72  ex if an appropr
7520: 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73 74  iate index exist
7530: 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79  s..** This analy
7540: 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  sis does not con
7550: 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f 72  sider whether or
7560: 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20 65   not the index e
7570: 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69  xists; that.** i
7580: 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65 20  s something the 
7590: 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75 74  bestIndex() rout
75a0: 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ine will determi
75b0: 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73  ne.  This analys
75c0: 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73  is.** only looks
75d0: 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62 74   at whether subt
75e0: 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74 65  erms appropriate
75f0: 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78   for indexing ex
7600: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65  ist..**.** All e
7610: 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67  xamples A throug
7620: 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73 61  h E above all sa
7630: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 42  tisfy case 2.  B
7640: 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20  ut if a term.** 
7650: 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73 20  also statisfies 
7660: 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73 20  case 1 (such as 
7670: 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  B) we know that 
7680: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77 69  the optimizer wi
7690: 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72 65  ll.** always pre
76a0: 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20 69  fer case 1, so i
76b0: 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20 70  n that case we p
76c0: 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73 65  retend that case
76d0: 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74   2 is not.** sat
76e0: 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74  isfied..**.** It
76f0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
7700: 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c 65  se that multiple
7710: 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64 65   tables are inde
7720: 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d  xable.  For exam
7730: 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76  ple,.** (E) abov
7740: 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20 6f  e is indexable o
7750: 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20 61  n tables P, Q, a
7760: 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  nd R..**.** Term
7770: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
7780: 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69 64  ase 2 are candid
7790: 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20  ates for lookup 
77a0: 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61  by using.** sepa
77b0: 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f 20  rate indices to 
77c0: 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72 20  find rowids for 
77d0: 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e 64  each subterm and
77e0: 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68   composing.** th
77f0: 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72  e union of all r
7800: 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52 6f  owids using a Ro
7810: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
7820: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  is is similar.**
7830: 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64 69   to "bitmap indi
7840: 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64 61  ces" in other da
7850: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a  tabase engines..
7860: 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a  **.** OTHERWISE:
7870: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
7880: 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61 73  r case 1 nor cas
7890: 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e 20  e 2 apply, then 
78a0: 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72 61  leave the eOpera
78b0: 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65  tor set to.** ze
78c0: 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20 69  ro.  This term i
78d0: 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f 72  s not useful for
78e0: 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74   search..*/.stat
78f0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
7900: 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72 63  yzeOrTerm(.  Src
7910: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
7920: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
7930: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
7940: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
7960: 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20 63  complete WHERE c
7970: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
7980: 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  dxTerm          
7990: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
79a0: 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20   the OR-term to 
79b0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
79c0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
79d0: 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b  e = pWC->pParse;
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
79f0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
7a00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7a10: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
7a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
7a30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7a40: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
7a50: 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e   *pTerm = &pWC->
7a60: 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f  a[idxTerm];    /
7a70: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
7a80: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45   analyzed */.  E
7a90: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
7aa0: 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20 20  rm->pExpr;      
7ab0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
7ac0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
7ad0: 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d  term */.  WhereM
7ae0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
7af0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
7b00: 3b 20 2f 2a 20 54 61 62 6c 65 20 75 73 65 20 6d  ; /* Table use m
7b10: 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  asks */.  int i;
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7b50: 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  rs */.  WhereCla
7b60: 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 20  use *pOrWc;     
7b70: 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66 20    /* Breakup of 
7b80: 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74 65  pTerm into subte
7b90: 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  rms */.  WhereTe
7ba0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20  rm *pOrTerm;    
7bb0: 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d     /* A Sub-term
7bc0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72 57   within the pOrW
7bd0: 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e  c */.  WhereOrIn
7be0: 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20  fo *pOrInfo;    
7bf0: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 69   /* Additional i
7c00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63  nformation assoc
7c10: 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72 6d  iated with pTerm
7c20: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63 68   */.  Bitmask ch
7c30: 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20 20  ngToIN;         
7c40: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
7c50: 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61 73  ight satisfy cas
7c60: 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  e 1 */.  Bitmask
7c70: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
7c80: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
7c90: 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2c  t are indexable,
7ca0: 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73 65   satisfying case
7cb0: 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   2 */..  /*.  **
7cc0: 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63 6c   Break the OR cl
7cd0: 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73 65  ause into its se
7ce0: 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73 2e  parate subterms.
7cf0: 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20 61    The subterms a
7d00: 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  re.  ** stored i
7d10: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  n a WhereClause 
7d20: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
7d30: 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65 20  ning within the 
7d40: 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a  WhereOrInfo.  **
7d50: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
7d60: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
7d70: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75  original OR clau
7d80: 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  se term..  */.  
7d90: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
7da0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
7db0: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49  DYNAMIC|TERM_ORI
7dc0: 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f  NFO|TERM_ANDINFO
7dd0: 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
7de0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
7df0: 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e  _OR );.  pTerm->
7e00: 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49  u.pOrInfo = pOrI
7e10: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
7e20: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7e30: 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b  zeof(*pOrInfo));
7e40: 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d  .  if( pOrInfo==
7e50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
7e60: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
7e70: 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70  TERM_ORINFO;.  p
7e80: 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d  OrWc = &pOrInfo-
7e90: 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  >wc;.  whereClau
7ea0: 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70 57  seInit(pOrWc, pW
7eb0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b  C->pParse, pMask
7ec0: 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  Set);.  whereSpl
7ed0: 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70 72 2c  it(pOrWc, pExpr,
7ee0: 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41   TK_OR);.  exprA
7ef0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20  nalyzeAll(pSrc, 
7f00: 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20 64 62  pOrWc);.  if( db
7f10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7f20: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
7f30: 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e  t( pOrWc->nTerm>
7f40: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  =2 );..  /*.  **
7f50: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73 65 74   Compute the set
7f60: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
7f70: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
7f80: 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f  ses 1 or 2..  */
7f90: 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e  .  indexable = ~
7fa0: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68  (Bitmask)0;.  ch
7fb0: 6e 67 54 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e  ngToIN = ~(pWC->
7fc0: 76 6d 61 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d  vmask);.  for(i=
7fd0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
7fe0: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
7ff0: 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61  ; i>=0 && indexa
8000: 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  ble; i--, pOrTer
8010: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
8020: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8030: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d  r & WO_SINGLE)==
8040: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
8050: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
8060: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
8070: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8080: 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tor==0 );.      
8090: 61 73 73 65 72 74 28 20 28 70 4f 72 54 65 72 6d  assert( (pOrTerm
80a0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
80b0: 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f  M_ANDINFO|TERM_O
80c0: 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  RINFO))==0 );.  
80d0: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30      chngToIN = 0
80e0: 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e 66 6f  ;.      pAndInfo
80f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8100: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8110: 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20  (*pAndInfo));.  
8120: 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e 66 6f      if( pAndInfo
8130: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
8140: 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 3b  eClause *pAndWC;
8150: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
8160: 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20  rm *pAndTerm;.  
8170: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8180: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
8190: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   0;.        pOrT
81a0: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20  erm->u.pAndInfo 
81b0: 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20  = pAndInfo;.    
81c0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
81d0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44  lags |= TERM_AND
81e0: 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f  INFO;.        pO
81f0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8200: 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20   = WO_AND;.     
8210: 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70 41 6e     pAndWC = &pAn
8220: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
8230: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
8240: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e  it(pAndWC, pWC->
8250: 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
8260: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
8270: 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f  Split(pAndWC, pO
8280: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b  rTerm->pExpr, TK
8290: 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65  _AND);.        e
82a0: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
82b0: 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20  rc, pAndWC);.   
82c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
82d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
82e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
82f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
8310: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
8320: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
8330: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
8340: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
8350: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8360: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
8370: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
8380: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
8390: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
83a0: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
83b0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
83c0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64  k(pMaskSet, pAnd
83d0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
83e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
83f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8410: 6e 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20  ndexable &= b;. 
8420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8430: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8440: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
8450: 49 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  IED ){.      /* 
8460: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66  Skip this term f
8470: 6f 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69  or now.  We revi
8480: 73 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70  sit it when we p
8490: 72 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20  rocess the.     
84a0: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   ** correspondin
84b0: 67 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74  g TERM_VIRTUAL t
84c0: 65 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  erm */.    }else
84d0: 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
84e0: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74  b;.      b = get
84f0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
8500: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
8510: 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
8520: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8530: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
8540: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
8550: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
8560: 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d  OrWc->a[pOrTerm-
8570: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
8580: 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28     b |= getMask(
8590: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65 72  pMaskSet, pOther
85a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20  ->leftCursor);. 
85b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 64       }.      ind
85c0: 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20  exable &= b;.   
85d0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
85e0: 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
85f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
8600: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
8620: 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20  hngToIN &= b;.  
8630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8640: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72  .  /*.  ** Recor
8650: 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61 62  d the set of tab
8660: 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66 79  les that satisfy
8670: 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73 65   case 2.  The se
8680: 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20  t might be.  ** 
8690: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f  empty..  */.  pO
86a0: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
86b0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20   = indexable;.  
86c0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
86d0: 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20   = indexable==0 
86e0: 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20  ? 0 : WO_OR;..  
86f0: 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  /*.  ** chngToIN
8700: 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20   holds a set of 
8710: 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67  tables that *mig
8720: 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73 65  ht* satisfy case
8730: 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65   1.  But.  ** we
8740: 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65   have to do some
8750: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63   additional chec
8760: 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63  king to see if c
8770: 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a  ase 1 really.  *
8780: 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a  * is satisfied..
8790: 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f    **.  ** chngTo
87a0: 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74  IN will hold eit
87b0: 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62  her 0, 1, or 2 b
87c0: 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20  its.  The 0-bit 
87d0: 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  case means.  ** 
87e0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
87f0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20   possibility of 
8800: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
8810: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
8820: 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61  an.  ** IN opera
8830: 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  tor because one 
8840: 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e  or more terms in
8850: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63   the OR clause c
8860: 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ontain.  ** some
8870: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8880: 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   == on a column 
8890: 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61  in the single ta
88a0: 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a  ble.  The 1-bit.
88b0: 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20    ** case means 
88c0: 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d 20  that every term 
88d0: 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  of the OR clause
88e0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
88f0: 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75    ** "table.colu
8900: 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d  mn=expr" for som
8910: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
8920: 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61   The one bit tha
8930: 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69  t is set.  ** wi
8940: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ll correspond to
8950: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   the common tabl
8960: 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65  e.  We still nee
8970: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
8980: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65  ke.  ** sure the
8990: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
89a0: 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  used on all term
89b0: 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63 61  s.  The 2-bit ca
89c0: 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20  se is when.  ** 
89d0: 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72  the all terms ar
89e0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  e of the form "t
89f0: 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62  able1.column=tab
8a00: 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74  le2.column".  It
8a10: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70  .  ** might be p
8a20: 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20  ossible to form 
8a30: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
8a40: 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c 65  ith either table
8a50: 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72  1.column.  ** or
8a60: 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61   table2.column a
8a70: 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69 74  s the LHS if eit
8a80: 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  her is common to
8a90: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20   every term of. 
8aa0: 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73   ** the OR claus
8ab0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  e..  **.  ** Not
8ac0: 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20  e that terms of 
8ad0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e  the form "table.
8ae0: 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f  column1=table.co
8af0: 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a  lumn2" (the.  **
8b00: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62   same table on b
8b10: 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65  oth sizes of the
8b20: 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f   ==) cannot be o
8b30: 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  ptimized..  */. 
8b40: 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b   if( chngToIN ){
8b50: 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e  .    int okToChn
8b60: 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f  gToIN = 0;     /
8b70: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63 6f  * True if the co
8b80: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69  nversion to IN i
8b90: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
8ba0: 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  nt iColumn = -1;
8bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
8bc0: 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20  mn index on lhs 
8bd0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
8be0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f  /.    int iCurso
8bf0: 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  r = -1;         
8c00: 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20  /* Table cursor 
8c10: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65  common to all te
8c20: 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  rms */.    int j
8c30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8c40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8c50: 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  nter */..    /* 
8c60: 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61 62  Search for a tab
8c70: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68  le and column th
8c80: 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e  at appears on on
8c90: 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20  e side or the.  
8ca0: 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68    ** other of th
8cb0: 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e  e == operator in
8cc0: 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20   every subterm. 
8cd0: 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   That table and 
8ce0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69  column.    ** wi
8cf0: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
8d00: 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  n iCursor and iC
8d10: 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69  olumn.  There mi
8d20: 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20  ght not be any. 
8d30: 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65     ** such table
8d40: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65   and column.  Se
8d50: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69  t okToChngToIN i
8d60: 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  f an appropriate
8d70: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e   table.    ** an
8d80: 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e  d column is foun
8d90: 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f  d but leave okTo
8da0: 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69  ChngToIN false i
8db0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20  f not found..   
8dc0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
8dd0: 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e   j<2 && !okToChn
8de0: 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  gToIN; j++){.   
8df0: 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72     pOrTerm = pOr
8e00: 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72  Wc->a;.      for
8e10: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
8e20: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  1; i>=0; i--, pO
8e30: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
8e40: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
8e50: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
8e60: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _EQ );.        p
8e70: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8e80: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
8e90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
8ea0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
8eb0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
8ec0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
8ed0: 20 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   the 2-bit case 
8ee0: 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68  and we are on th
8ef0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
8f00: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  on and.         
8f10: 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d   ** current term
8f20: 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72   is from the fir
8f30: 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53  st iteration.  S
8f40: 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d  o skip this term
8f50: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
8f60: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
8f70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8f80: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
8f90: 20 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f       if( (chngTo
8fa0: 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  IN & getMask(pMa
8fb0: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
8fc0: 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20  leftCursor))==0 
8fd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8fe0: 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62  This term must b
8ff0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31  e of the form t1
9000: 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74  .a==t2.b where t
9010: 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20  2 is in the.    
9020: 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49        ** chngToI
9030: 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73 20  N set but t1 is 
9040: 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20  not.  This term 
9050: 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70  will be either p
9060: 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20 20  receeded.       
9070: 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64     ** or follwed
9080: 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64 20   by an inverted 
9090: 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61  copy (t2.b==t1.a
90a0: 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74 65  ).  Skip this te
90b0: 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rm .          **
90c0: 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e 76   and use its inv
90d0: 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ersion. */.     
90e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
90f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9100: 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b  & TERM_COPIED );
9110: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9120: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9130: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
9140: 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  TUAL );.        
9150: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9160: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
9170: 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56  RM_COPIED|TERM_V
9180: 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20 20  IRTUAL) );.     
9190: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
91a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
91b0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65   iColumn = pOrTe
91c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
91d0: 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73 6f  ;.        iCurso
91e0: 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  r = pOrTerm->lef
91f0: 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  tCursor;.       
9200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9210: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b        if( i<0 ){
9220: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63  .        /* No c
9230: 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b 63  andidate table+c
9240: 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e  olumn was found.
9250: 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
9260: 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  occur.        **
9270: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9280: 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  teration */.    
9290: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
92a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
92b0: 72 74 28 20 28 63 68 6e 67 54 6f 49 4e 26 28 63  rt( (chngToIN&(c
92c0: 68 6e 67 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29  hngToIN-1))==0 )
92d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
92e0: 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d  ( chngToIN==getM
92f0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 43  ask(pMaskSet, iC
9300: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9320: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9330: 20 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20   j==1 );..      
9340: 2f 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64  /* We have found
9350: 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62   a candidate tab
9360: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20  le and column.  
9370: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
9380: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61  that.      ** ta
9390: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69  ble and column i
93a0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
93b0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
93c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
93d0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
93e0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69  1;.      for(; i
93f0: 3e 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54  >=0 && okToChngT
9400: 6f 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  oIN; i--, pOrTer
9410: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
9420: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9430: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
9440: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9450: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
9460: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
9470: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
9480: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
9490: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
94a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
94b0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
94c0: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
94d0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
94e0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
94f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9500: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
9510: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
9520: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
9530: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
9540: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
9550: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
9560: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
9570: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
9580: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
9590: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
95a0: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
95b0: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
95c0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
95d0: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
95e0: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
95f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9600: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
9610: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
9620: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
9630: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
9640: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
9650: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9660: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
9670: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9680: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
9690: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
96a0: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
96b0: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
96c0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
96d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
96e0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
96f0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
9700: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
9710: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9730: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
9740: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
9750: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
9760: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
9770: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
9780: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
9790: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
97a0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
97b0: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
97c0: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
97d0: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
97e0: 6f 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  or..    **.    *
97f0: 2a 20 45 56 3a 20 52 2d 30 30 32 31 31 2d 31 35  * EV: R-00211-15
9800: 31 30 30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  100.    */.    i
9810: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
9820: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
9830: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
9840: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
9850: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
9860: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
9870: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
9880: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
9890: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
98a0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
98b0: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
98c0: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
98d0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
98e0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
98f0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
9900: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
9910: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
9920: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
9930: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
9940: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
9950: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
9960: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
9970: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
9980: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
9990: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
99a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
99b0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
99c0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
99d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
99e0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
99f0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ==iCursor );.   
9a00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9a10: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
9a20: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20  mn==iColumn );. 
9a30: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9a40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9a50: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
9a60: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
9a70: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
9a80: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
9a90: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
9aa0: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
9ab0: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
9ac0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
9ad0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
9ae0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
9af0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
9b00: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9b10: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
9b20: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
9b30: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9b40: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
9b50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
9b60: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
9b70: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
9b80: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
9b90: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
9ba0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
9bb0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9bc0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
9bd0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
9be0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
9bf0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
9c00: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
9c10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
9c20: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
9c30: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
9c40: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
9c50: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
9c60: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
9c70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
9c80: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
9c90: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
9ca0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
9cb0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
9cc0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
9cd0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
9ce0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
9cf0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
9d00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9d10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
9d20: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
9d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65       }.      pTe
9d40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
9d50: 30 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  0;  /* case 1 tr
9d60: 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20  umps case 2 */. 
9d70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
9d80: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9d90: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
9da0: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
9db0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
9dc0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
9dd0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
9de0: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
9df0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
9e00: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
9e10: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
9e20: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
9e30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9e40: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
9e50: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
9e60: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
9e70: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
9e80: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
9e90: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
9ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
9eb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
9ec0: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
9ed0: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
9ee0: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
9ef0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
9f00: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
9f10: 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  r>"..**.** If th
9f20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9f30: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
9f40: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
9f50: 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a  h X and Y are.**
9f60: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
9f70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
9f80: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
9f90: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
9fa0: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66  rtual.** term of
9fb0: 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70   the form "Y <op
9fc0: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
9fd0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9fe0: 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65  e and.** analyze
9ff0: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54  d separately.  T
a000: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
a010: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
a020: 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61  TERM_COPIED.** a
a030: 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20  nd the new term 
a040: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a050: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63  ERM_DYNAMIC (bec
a060: 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a  ause it's pExpr.
a070: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  ** needs to be f
a080: 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68  reed with the Wh
a090: 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54  ereClause) and T
a0a0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63  ERM_VIRTUAL (bec
a0b0: 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20  ause it.** is a 
a0c0: 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66  commuted copy of
a0d0: 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20   a prior term.) 
a0e0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
a0f0: 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a  rm has nChild=1.
a100: 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20  ** and the copy 
a110: 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65  has idxParent se
a120: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
a130: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  f the original t
a140: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
a150: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
a160: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
a170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
a180: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a190: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
a1a0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
a1b0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
a1c0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
a1d0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
a1e0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
a1f0: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
a200: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
a210: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a230: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
a240: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57   analyzed */.  W
a250: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
a260: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  skSet;          
a270: 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20  /* Set of table 
a280: 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20  index masks */. 
a290: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a2c0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
a2d0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
a2e0: 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20  prereqLeft;     
a2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
a300: 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65  equesites of the
a310: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f   pExpr->pLeft */
a320: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
a330: 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  qAll;           
a340: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
a350: 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f  ites of pExpr */
a360: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
a370: 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20  Right = 0;      
a380: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70      /* Extra dep
a390: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46  endencies on LEF
a3a0: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72  T JOIN */.  Expr
a3b0: 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20   *pStr1 = 0;    
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3d0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
a3e0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
a3f0: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20  nt isComplete = 
a400: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a410: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
a420: 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69  LOB ends with wi
a430: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20  ldcard */.  int 
a440: 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20  noCase = 0;     
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a460: 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e  LIKE/GLOB distin
a470: 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a  guishes case */.
a480: 20 20 69 6e 74 20 6f 70 3b 20 20 20 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 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
a4b0: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
a4c0: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
a4d0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
a4e0: 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61  Parse;     /* Pa
a4f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a500: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a510: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
a520: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a530: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
a540: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
a550: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a560: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
a570: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
a580: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
a590: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
a5a0: 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d  .  pExpr = pTerm
a5b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65  ->pExpr;.  prere
a5c0: 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c  qLeft = exprTabl
a5d0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a5e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
a5f0: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
a600: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
a610: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
a620: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
a630: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  0 );.    if( Exp
a640: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a650: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
a660: 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  ) ){.      pTerm
a670: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
a680: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
a690: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
a6a0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
a6b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6c0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
a6d0: 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74  Right = exprList
a6e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
a6f0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Set, pExpr->x.pL
a700: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ist);.    }.  }e
a710: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
a720: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
a730: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a740: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a750: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
a760: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
a770: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a780: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a790: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
a7a0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
a7b0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a7c0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
a7d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a7e0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
a7f0: 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20      Bitmask x = 
a800: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
a810: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
a820: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  oinTable);.    p
a830: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20  rereqAll |= x;. 
a840: 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20     extraRight = 
a850: 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75  x-1;  /* ON clau
a860: 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74  se terms may not
a870: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
a880: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a8a0: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f   on left table o
a8b0: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
a8c0: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a  Ticket #3015 */.
a8d0: 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65    }.  pTerm->pre
a8e0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
a8f0: 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66  ll;.  pTerm->lef
a900: 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  tCursor = -1;.  
a910: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
a920: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f   -1;.  pTerm->eO
a930: 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69  perator = 0;.  i
a940: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  f( allowedOp(op)
a950: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
a960: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
a970: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
a980: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
a990: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
a9a0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
a9b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
a9c0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a9d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a9e0: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a9f0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
aa00: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
aa10: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
aa20: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
aa30: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
aa40: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
aa50: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20  atorMask(op);.  
aa60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
aa70: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
aa80: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
aa90: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
aaa0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
aab0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
aac0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
aad0: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
aae0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
aaf0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
ab00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ab10: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
ab20: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
ab30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
ab40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ab50: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
ab60: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
ab70: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
ab80: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
ab90: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
aba0: 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d  (pWC, pDup, TERM
abb0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
abc0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
abd0: 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20  if( idxNew==0 ) 
abe0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
abf0: 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69  pNew = &pWC->a[i
ac00: 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20  dxNew];.        
ac10: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20  pNew->iParent = 
ac20: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  idxTerm;.       
ac30: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
ac40: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
ac50: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
ac60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54   = 1;.        pT
ac70: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
ac80: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
ac90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aca0: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
acb0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
acc0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
acd0: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
ace0: 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20  pParse, pDup);. 
acf0: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75       pLeft = pDu
ad00: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
ad10: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
ad20: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ad30: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
ad40: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
ad50: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
ad60: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72     testcase( (pr
ad70: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
ad80: 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71  Right) != prereq
ad90: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e  Left );.      pN
ada0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
adb0: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65  = prereqLeft | e
adc0: 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20  xtraRight;.     
add0: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
ade0: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
adf0: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
ae00: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
ae10: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20  sk(pDup->op);.  
ae20: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
ae30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
ae40: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
ae50: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
ae60: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
ae70: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
ae80: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
ae90: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
aea0: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
aeb0: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
aec0: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20  EN implements.  
aed0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  For example:.  *
aee0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45  *.  **      a BE
aef0: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20  TWEEN b AND c.  
af00: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
af10: 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rted into:.  **.
af20: 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54    **      (a BET
af30: 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e  WEEN b AND c) AN
af40: 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c  D (a>=b) AND (a<
af50: 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  =c).  **.  ** Th
af60: 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20  e two new terms 
af70: 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  are added onto t
af80: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68  he end of the Wh
af90: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
afa0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74  ..  ** The new t
afb0: 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69  erms are "dynami
afc0: 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64  c" and are child
afd0: 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ren of the origi
afe0: 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a  nal BETWEEN.  **
aff0: 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61   term.  That mea
b000: 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42  ns that if the B
b010: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63  ETWEEN term is c
b020: 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72  oded, the childr
b030: 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70  en are.  ** skip
b040: 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  ped.  Or, if the
b050: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61   children are sa
b060: 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e  tisfied by an in
b070: 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  dex, the origina
b080: 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74  l.  ** BETWEEN t
b090: 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  erm is skipped..
b0a0: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
b0b0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
b0c0: 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70  TWEEN && pWC->op
b0d0: 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
b0e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
b0f0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b100: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
b110: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
b120: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
b130: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
b140: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
b150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
b160: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
b170: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
b180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
b190: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
b1a0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
b1b0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
b1c0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b1d0: 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20  arse, ops[i], . 
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 20 20 20 73 71 6c 69              sqli
b200: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b210: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c  Expr->pLeft, 0),
b220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b240: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b250: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
b260: 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  pr, 0), 0);.    
b270: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
b280: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b290: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
b2a0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
b2b0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
b2c0: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
b2d0: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
b2e0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
b2f0: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
b300: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b310: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
b320: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
b330: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b340: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
b350: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
b360: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
b370: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
b380: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
b390: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
b3a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
b3b0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
b3c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b3d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
b3e0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
b3f0: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
b400: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
b410: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
b420: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
b430: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
b440: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
b450: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
b460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
b470: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
b480: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
b490: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
b4a0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
b4b0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b4c0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
b4d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b4e0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
b4f0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
b500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b510: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
b520: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
b530: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
b540: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
b550: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
b560: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
b570: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
b580: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
b590: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
b5a0: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
b5b0: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
b5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
b5d0: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
b5e0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
b5f0: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
b600: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
b610: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
b620: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
b630: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
b640: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
b650: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
b660: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
b670: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
b680: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
b690: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
b6a0: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
b6b0: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
b6c0: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
b6d0: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
b6e0: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
b6f0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
b700: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
b710: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
b720: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
b730: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
b740: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
b750: 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
b760: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
b770: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
b780: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
b790: 32 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  2;.    CollSeq *
b7a0: 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  pColl;    /* Col
b7b0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
b7c0: 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70  to use */..    p
b7d0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
b7e0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
b7f0: 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73  r;.    pStr2 = s
b800: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b810: 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20  , pStr1, 0);.   
b820: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
b830: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
b840: 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20  u8 c, *pC;      
b850: 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74   /* Last charact
b860: 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  er before the fi
b870: 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a  rst wildcard */.
b880: 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29        pC = (u8*)
b890: 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pStr2->u.zToken
b8a0: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
b8b0: 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pStr2->u.zToken
b8c0: 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20  )-1];.      c = 
b8d0: 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  *pC;.      if( n
b8e0: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
b8f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73   /* The point is
b900: 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
b910: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
b920: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
b930: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  t.        ** wil
b940: 64 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77  dcard.  But if w
b950: 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c  e increment '@',
b960: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
b970: 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  it into the.    
b980: 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69      ** alphabeti
b990: 63 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61  c range where ca
b9a0: 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77  se conversions w
b9b0: 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20  ill mess up the 
b9c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71  .        ** ineq
b9d0: 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69  uality.  To avoi
b9e0: 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72  d this, make sur
b9f0: 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68  e to also run th
ba00: 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e full.        *
ba10: 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61  * LIKE on all ca
ba20: 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69  ndidate expressi
ba30: 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20  ons by clearing 
ba40: 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66  the isComplete f
ba50: 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  lag.        */. 
ba60: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41         if( c=='A
ba70: 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65  '-1 ) isComplete
ba80: 20 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52   = 0;   /* EV: R
ba90: 2d 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a  -64339-08207 */.
baa0: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ..        c = sq
bab0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
bac0: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
bad0: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
bae0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
baf0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
bb00: 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
bb10: 5f 55 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20  _UTF8, noCase ? 
bb20: 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
bb30: 52 59 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77  RY",0);.    pNew
bb40: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
bb50: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
bb60: 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  GE, .           
bb70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bb80: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c  3ExprSetColl(sql
bb90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
bba0: 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c  Left,0), pColl),
bbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bbc0: 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
bbd0: 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77  .    idxNew1 = w
bbe0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
bbf0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c  (pWC, pNewExpr1,
bc00: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
bc10: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
bc20: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
bc30: 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w1==0 );.    exp
bc40: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
bc50: 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20  WC, idxNew1);.  
bc60: 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71    pNewExpr2 = sq
bc70: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bc80: 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20  e, TK_LT,.      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
bca0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c  qlite3ExprSetCol
bcb0: 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  l(sqlite3ExprDup
bcc0: 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43  (db,pLeft,0), pC
bcd0: 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20  oll),.          
bce0: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32             pStr2
bcf0: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
bd00: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
bd10: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
bd20: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
bd30: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
bd40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bd50: 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
bd60: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bd70: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
bd80: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
bd90: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bda0: 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
bdb0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
bdc0: 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
bdd0: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
bde0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
bdf0: 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
be00: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
be10: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
be20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
be30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
be40: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
be50: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
be60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
be70: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
be80: 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
be90: 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
bea0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
beb0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
bec0: 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
bed0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
bee0: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
bef0: 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
bf00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
bf10: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
bf20: 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
bf30: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
bf40: 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
bf50: 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
bf60: 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
bf70: 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
bf80: 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
bf90: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
bfa0: 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
bfb0: 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
bfc0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
bfd0: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
bfe0: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
bff0: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
c000: 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
c010: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
c020: 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
c030: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
c040: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
c050: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
c060: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
c070: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
c080: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
c090: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
c0a0: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
c0b0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
c0c0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
c0d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
c0e0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
c0f0: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
c100: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
c110: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
c120: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
c130: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
c140: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
c150: 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
c180: 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
c190: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
c1a0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
c1b0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c1c0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
c1d0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
c1e0: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
c1f0: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
c200: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
c210: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
c220: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
c230: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
c240: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
c250: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
c260: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
c270: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
c280: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
c290: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
c2a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
c2b0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
c2c0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
c2d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
c2e0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c2f0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
c300: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
c310: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
c320: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
c330: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
c340: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
c350: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c360: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
c370: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
c380: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c390: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
c3a0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
c3b0: 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c  /* Prevent ON cl
c3c0: 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20  ause terms of a 
c3d0: 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62  LEFT JOIN from b
c3e0: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69  eing used to dri
c3f0: 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  ve.  ** an index
c400: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74   for tables to t
c410: 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
c420: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72  oin..  */.  pTer
c430: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c  m->prereqRight |
c440: 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a  = extraRight;.}.
c450: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
c460: 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  UE if any of the
c470: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
c480: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e  pList->a[iFirst.
c490: 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  ..] contain.** a
c4a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
c4b0: 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  y table other th
c4c0: 61 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62  an the iBase tab
c4d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
c4e0: 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65  t referencesOthe
c4f0: 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c  rTables(.  ExprL
c500: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
c510: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65       /* Search e
c520: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
c530: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  s list */.  Wher
c540: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
c550: 65 74 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67  et,   /* Mapping
c560: 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20   from tables to 
c570: 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74  bitmaps */.  int
c580: 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
c590: 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61         /* Be sea
c5a0: 72 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20  rching with the 
c5b0: 69 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73  iFirst-th expres
c5c0: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42  sion */.  int iB
c5d0: 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ase             
c5e0: 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65      /* Ignore re
c5f0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
c600: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42   table */.){.  B
c610: 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d  itmask allowed =
c620: 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
c630: 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68  et, iBase);.  wh
c640: 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73  ile( iFirst<pLis
c650: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
c660: 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73  if( (exprTableUs
c670: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c  age(pMaskSet, pL
c680: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d  ist->a[iFirst++]
c690: 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29  .pExpr)&allowed)
c6a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
c6b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
c6c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c6d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c6e0: 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70  ine decides if p
c6f0: 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  Idx can be used 
c700: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  to satisfy the O
c710: 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73  RDER BY.** claus
c720: 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69  e.  If it can, i
c730: 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66  t returns 1.  If
c740: 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74   pIdx cannot sat
c750: 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45  isfy the.** ORDE
c760: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69  R BY clause, thi
c770: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
c780: 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  s 0..**.** pOrde
c790: 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20  rBy is an ORDER 
c7a0: 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61  BY clause from a
c7b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c7c0: 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a  t.  pTab is the.
c7d0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
c7e0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
c7f0: 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61  lause of that sa
c800: 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  me SELECT statem
c810: 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74  ent and.** the t
c820: 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f  able has a curso
c830: 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73  r number of "bas
c840: 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20  e".  pIdx is an 
c850: 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a  index on pTab..*
c860: 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74  *.** nEqCol is t
c870: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
c880: 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61  umns of pIdx tha
c890: 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71  t are used as eq
c8a0: 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72  uality.** constr
c8b0: 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74  aints.  Any of t
c8c0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  hese columns may
c8d0: 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d   be missing from
c8e0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
c8f0: 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
c900: 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20  match can still 
c910: 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a  be a success..**
c920: 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66  .** All terms of
c930: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68   the ORDER BY th
c940: 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  at match against
c950: 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
c960: 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43  be either.** ASC
c970: 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d   or DESC.  (Term
c980: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
c990: 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68  Y clause past th
c9a0: 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55  e end of a UNIQU
c9b0: 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f  E.** index do no
c9c0: 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66  t need to satisf
c9d0: 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  y this constrain
c9e0: 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20  t.)  The *pbRev 
c9f0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20  value is.** set 
ca00: 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45  to 1 if the ORDE
ca10: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
ca20: 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69  ll DESC and it i
ca30: 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a  s set to 0 if.**
ca40: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
ca50: 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e  ause is all ASC.
ca60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
ca70: 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20  sSortingIndex(. 
ca80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
caa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cab0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
cac0: 4d 61 73 6b 53 65 74 2c 20 2f 2a 20 4d 61 70 70  MaskSet, /* Mapp
cad0: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 63  ing from table c
cae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f  ursor numbers to
caf0: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e   bitmaps */.  In
cb00: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
cb10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
cb20: 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
cb30: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb50: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
cb60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f  for the table to
cb70: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
cb80: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
cb90: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
cba0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
cbb0: 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20  /.  int nEqCol, 
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cbd0: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
cbe0: 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63  olumns with == c
cbf0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
cc00: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
cc10: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
cc20: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
cc30: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
cc40: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
cc70: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
cc80: 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  der = 0;        
cc90: 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20        /* XOR of 
cca0: 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20  index and ORDER 
ccb0: 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f  BY sort directio
ccc0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  n */.  int nTerm
ccd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cce0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ccf0: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
cd00: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
cd10: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
cd20: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
cd30: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
cd40: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
cd50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cd60: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
cd70: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
cd80: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
cd90: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
cda0: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
cdb0: 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74  ;..  /* Argument
cdc0: 20 70 49 64 78 20 6d 75 73 74 20 65 69 74 68 65   pIdx must eithe
cdd0: 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65  r point to a 're
cde0: 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  al' named index 
cdf0: 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a  structure, .  **
ce00: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72   or an index str
ce10: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
ce20: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79   on the stack by
ce30: 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
ce40: 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73  ) to.  ** repres
ce50: 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e  ent the rowid in
ce60: 64 65 78 20 74 68 61 74 20 69 73 20 70 61 72 74  dex that is part
ce70: 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e   of every table.
ce80: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ce90: 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70  Idx->zName || (p
cea0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
ceb0: 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  && pIdx->aiColum
cec0: 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20  n[0]==-1) );..  
ced0: 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f  /* Match terms o
cee0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
cef0: 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f  lause against co
cf00: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
cf10: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
cf20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64  ** Note that ind
cf30: 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e  ices have pIdx->
cf40: 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20  nColumn regular 
cf50: 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a  columns plus.  *
cf60: 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c  * one additional
cf70: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69   column containi
cf80: 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54  ng the rowid.  T
cf90: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a  he rowid column.
cfa0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
cfb0: 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65  x is also allowe
cfc0: 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  d to match again
cfd0: 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  st the ORDER BY.
cfe0: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
cff0: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  /.  for(i=j=0, p
d000: 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Term=pOrderBy->a
d010: 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
d020: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
d030: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d040: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
d050: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
d060: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
d070: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
d080: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
d090: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
d0a0: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
d0b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d   */.    int term
d0c0: 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f  SortOrder; /* So
d0d0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
d0e0: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  s term */.    in
d0f0: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
d100: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c   /* The i-th col
d110: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
d120: 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20  .  -1 for rowid 
d130: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74  */.    int iSort
d140: 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66  Order;    /* 1 f
d150: 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
d160: 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
d170: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
d180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
d190: 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ll; /* Name of t
d1a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
d1b0: 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69  uence for i-th i
d1c0: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20  ndex term */..  
d1d0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
d1e0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
d1f0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
d200: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
d210: 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
d220: 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20       /* Can not 
d230: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72  use an index sor
d240: 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  t on anything th
d250: 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  at is not a colu
d260: 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  mn in the.      
d270: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
d280: 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  le of the FROM c
d290: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62  lause */.      b
d2a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d2b0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
d2c0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
d2d0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
d2e0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
d2f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
d300: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
d310: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e      if( pIdx->zN
d320: 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  ame && i<pIdx->n
d330: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
d340: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
d350: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
d360: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
d370: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
d380: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
d390: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
d3a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74     }.      iSort
d3b0: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
d3c0: 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
d3d0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d     zColl = pIdx-
d3e0: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
d3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f  }else{.      iCo
d400: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
d410: 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b   iSortOrder = 0;
d420: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
d430: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
d440: 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72   }.    if( pExpr
d450: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
d460: 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  mn || sqlite3Str
d470: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
d480: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
d490: 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20     /* Term j of 
d4a0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
d4b0: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  use does not mat
d4c0: 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74  ch column i of t
d4d0: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
d4e0: 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29    if( i<nEqCol )
d4f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
d500: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
d510: 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
d520: 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20  ned by == fails 
d530: 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20  to match an.    
d540: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
d550: 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b  term, that is OK
d560: 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74  .  Just ignore t
d570: 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  hat column of th
d580: 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
d590: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
d5a0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
d5b0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
d5c0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d5d0: 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e   /* Index column
d5e0: 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e   i is the rowid.
d5f0: 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d    All other term
d600: 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20  s match. */.    
d610: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d630: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
d640: 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d  olumn fails to m
d650: 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20  atch and is not 
d660: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
d670: 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  =.        ** the
d680: 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  n the index cann
d690: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
d6a0: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
d6b0: 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
d6c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d6e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
d6f0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c  >aSortOrder!=0 |
d700: 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b  | iColumn==-1 );
d710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
d720: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
d730: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
d740: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
d750: 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65  ssert( iSortOrde
d760: 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64  r==0 || iSortOrd
d770: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  er==1 );.    ter
d780: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f  mSortOrder = iSo
d790: 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d  rtOrder ^ pTerm-
d7a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
d7b0: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
d7c0: 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f        if( termSo
d7d0: 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64  rtOrder!=sortOrd
d7e0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
d7f0: 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c   Indices can onl
d800: 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  y be used if all
d810: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
d820: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20  past the.       
d830: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   ** equality con
d840: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
d850: 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20   either DESC or 
d860: 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ASC. */.        
d870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d880: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d890: 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74     sortOrder = t
d8a0: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ermSortOrder;.  
d8b0: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
d8c0: 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66   pTerm++;.    if
d8d0: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ( iColumn<0 && !
d8e0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
d8f0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
d900: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
d910: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
d920: 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
d930: 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d  lumn is the prim
d940: 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72  ary key and ever
d950: 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20  ything matches. 
d960: 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61       ** so far a
d970: 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f  nd none of the O
d980: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
d990: 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72   the right refer
d9a0: 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20  ence other.     
d9b0: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
d9c0: 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20  e join, then we 
d9d0: 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74  are assured that
d9e0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62   the index can b
d9f0: 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a  e used .      **
da00: 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65   to sort because
da10: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
da20: 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73   is unique and s
da30: 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  o none of the ot
da40: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  her.      ** col
da50: 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61  umns will make a
da60: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20  ny difference.  
da70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d      */.      j =
da80: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   nTerm;.    }.  
da90: 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  }..  *pbRev = so
daa0: 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66  rtOrder!=0;.  if
dab0: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
dac0: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
dad0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
dae0: 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65  lause are covere
daf0: 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20  d by this index 
db00: 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  so.    ** this i
db10: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
db20: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f   for sorting. */
db30: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
db40: 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
db50: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
db60: 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i==pIdx->nCol
db70: 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65  umn.      && !re
db80: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
db90: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
dba0: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
dbb0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
dbc0: 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64  erms of this ind
dbd0: 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72  ex match some pr
dbe0: 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45  efix of the ORDE
dbf0: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
dc00: 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
dc10: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e   is UNIQUE and n
dc20: 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74  o terms on the t
dc30: 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ail of the ORDER
dc40: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
dc50: 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  e reference othe
dc60: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
dc70: 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  in.  If this is 
dc80: 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20  all true then.  
dc90: 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62    ** the order b
dca0: 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65  y clause is supe
dcb0: 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20  rfluous. */.    
dcc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
dcd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
dce0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75  ** Prepare a cru
dcf0: 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  de estimate of t
dd00: 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  he logarithm of 
dd10: 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e  the input value.
dd20: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
dd30: 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63  need not be exac
dd40: 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  t.  This is only
dd50: 20 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61   used for estima
dd60: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61  ting.** the tota
dd70: 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72  l cost of perfor
dd80: 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  ming operations 
dd90: 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20  with O(logN) or 
dda0: 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70  O(NlogN).** comp
ddb0: 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65  lexity.  Because
ddc0: 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65   N is just a gue
ddd0: 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65  ss, it is no gre
dde0: 61 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a  at tragedy if.**
ddf0: 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c   logN is a littl
de00: 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  e off..*/.static
de10: 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64   double estLog(d
de20: 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62  ouble N){.  doub
de30: 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64  le logN = 1;.  d
de40: 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20  ouble x = 10;.  
de50: 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20  while( N>x ){.  
de60: 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20    logN += 1;.   
de70: 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20   x *= 10;.  }.  
de80: 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a  return logN;.}..
de90: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
dea0: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
deb0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
dec0: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
ded0: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
dee0: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
def0: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
df00: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
df10: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
df20: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
df30: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
df40: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
df50: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
df60: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
df70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
df80: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
df90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
dfa0: 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
dfb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  id TRACE_IDX_INP
dfc0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
dfd0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
dfe0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
dff0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
e000: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e010: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
e020: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
e030: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e040: 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b  f("  constraint[
e050: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d  %d]: col=%d term
e060: 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62  id=%d op=%d usab
e070: 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  led=%d\n",.     
e080: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e090: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43  Constraint[i].iC
e0a0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
e0b0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
e0c0: 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20  iTermOffset,.   
e0d0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
e0e0: 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20  nt[i].op,.      
e0f0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
e100: 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a  i].usable);.  }.
e110: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e120: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
e130: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
e140: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62  Printf("  orderb
e150: 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65  y[%d]: col=%d de
e160: 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  sc=%d\n",.      
e170: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f   i,.       p->aO
e180: 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
e190: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  n,.       p->aOr
e1a0: 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a  derBy[i].desc);.
e1b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
e1c0: 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  d TRACE_IDX_OUTP
e1d0: 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  UTS(sqlite3_inde
e1e0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e  x_info *p){.  in
e1f0: 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  t i;.  if( !sqli
e200: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20  te3WhereTrace ) 
e210: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e220: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
e230: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
e240: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
e250: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
e260: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
e270: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
e280: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e290: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
e2a0: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
e2b0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
e2c0: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
e2d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
e2e0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
e2f0: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
e300: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
e310: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
e320: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
e330: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
e340: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
e350: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
e360: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
e370: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
e380: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e390: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
e3a0: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
e3b0: 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
e3c0: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
e3d0: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
e3e0: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
e3f0: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
e400: 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69  if../* .** Requi
e410: 72 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74  red because best
e420: 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65  Index() is calle
e430: 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73  d by bestOrClaus
e440: 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61  eIndex() .*/.sta
e450: 74 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64  tic void bestInd
e460: 65 78 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20  ex(.    Parse*, 
e470: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74  WhereClause*, st
e480: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
e490: 6d 2a 2c 20 42 69 74 6d 61 73 6b 2c 20 45 78 70  m*, Bitmask, Exp
e4a0: 72 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6f 73  rList*, WhereCos
e4b0: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t*);../*.** This
e4c0: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
e4d0: 73 20 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61  s to find an sca
e4e0: 6e 6e 69 6e 67 20 73 74 72 61 74 65 67 79 20 74  nning strategy t
e4f0: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
e500: 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  .** to optimize 
e510: 61 6e 20 27 4f 52 27 20 65 78 70 72 65 73 73 69  an 'OR' expressi
e520: 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20  on that is part 
e530: 6f 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  of a WHERE claus
e540: 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  e. .**.** The ta
e550: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
e560: 69 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ith FROM clause 
e570: 74 65 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65  term pSrc may be
e580: 20 65 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67   either a.** reg
e590: 75 6c 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c  ular B-Tree tabl
e5a0: 65 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74  e or a virtual t
e5b0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
e5c0: 76 6f 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73  void bestOrClaus
e5d0: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
e5e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e5f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
e600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e610: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
e620: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
e630: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
e640: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
e650: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
e660: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
e670: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
e680: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
e690: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
e6a0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
e6b0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
e6c0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
e6d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e6e0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
e6f0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
e700: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
e710: 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
e730: 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
e740: 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  an */.){.#ifndef
e750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
e760: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 63  OPTIMIZATION.  c
e770: 6f 6e 73 74 20 69 6e 74 20 69 43 75 72 20 3d 20  onst int iCur = 
e780: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20  pSrc->iCursor;  
e790: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
e7a0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
e7b0: 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20  e accessed */.  
e7c0: 63 6f 6e 73 74 20 42 69 74 6d 61 73 6b 20 6d 61  const Bitmask ma
e7d0: 73 6b 53 72 63 20 3d 20 67 65 74 4d 61 73 6b 28  skSrc = getMask(
e7e0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
e7f0: 43 75 72 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73  Cur);  /* Bitmas
e800: 6b 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20  k for pSrc */.  
e810: 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
e820: 74 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d  t pWCEnd = &pWC-
e830: 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20  >a[pWC->nTerm]; 
e840: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
e850: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57   pWC->a[] */.  W
e860: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
e890: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
e8a0: 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4e  lause */..  /* N
e8b0: 6f 20 4f 52 2d 63 6c 61 75 73 65 20 6f 70 74 69  o OR-clause opti
e8c0: 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  mization allowed
e8d0: 20 69 66 20 74 68 65 20 4e 4f 54 20 49 4e 44 45   if the NOT INDE
e8e0: 58 45 44 20 63 6c 61 75 73 65 20 69 73 20 75 73  XED clause is us
e8f0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  ed */.  if( pSrc
e900: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
e910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e920: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65  .  /* Search the
e930: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
e940: 72 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65  rms for a usable
e950: 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a   WO_OR term. */.
e960: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
e970: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
e980: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
e990: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
e9a0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20  ator==WO_OR .   
e9b0: 20 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72    && ((pTerm->pr
e9c0: 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53  ereqAll & ~maskS
e9d0: 72 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  rc) & notReady)=
e9e0: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
e9f0: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  m->u.pOrInfo->in
ea00: 64 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72  dexable & maskSr
ea10: 63 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  c)!=0 .    ){.  
ea20: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
ea30: 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20  * const pOrWC = 
ea40: 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  &pTerm->u.pOrInf
ea50: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65  o->wc;.      Whe
ea60: 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
ea70: 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43  OrWCEnd = &pOrWC
ea80: 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d  ->a[pOrWC->nTerm
ea90: 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ];.      WhereTe
eaa0: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20  rm *pOrTerm;.   
eab0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57     int flags = W
eac0: 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
ead0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74       double rTot
eae0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  al = 0;.      do
eaf0: 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  uble nRow = 0;. 
eb00: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65       Bitmask use
eb10: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f  d = 0;..      fo
eb20: 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
eb30: 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
eb40: 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
eb50: 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43  {.        WhereC
eb60: 6f 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20  ost sTermCost;. 
eb70: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
eb80: 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e  E(("... Multi-in
eb90: 64 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66  dex OR testing f
eba0: 6f 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64  or term %d of %d
ebb0: 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20  ....\n", .      
ebc0: 20 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70      (pOrTerm - p
ebd0: 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d  OrWC->a), (pTerm
ebe0: 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20   - pWC->a).     
ebf0: 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69     ));.        i
ec00: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
ec10: 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
ec20: 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
ec30: 43 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d  Clause *pAndWC =
ec40: 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e   &pOrTerm->u.pAn
ec50: 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20  dInfo->wc;.     
ec60: 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70       bestIndex(p
ec70: 50 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70  Parse, pAndWC, p
ec80: 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30  Src, notReady, 0
ec90: 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20  , &sTermCost);. 
eca0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ecb0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
ecc0: 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
ecd0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
ece0: 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20  use tempWC;.    
ecf0: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61        tempWC.pPa
ed00: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
ed10: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  e;.          tem
ed20: 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70  pWC.pMaskSet = p
ed30: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20  WC->pMaskSet;.  
ed40: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f          tempWC.o
ed50: 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
ed60: 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d        tempWC.a =
ed70: 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20   pOrTerm;.      
ed80: 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
ed90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
eda0: 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
edb0: 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c  , &tempWC, pSrc,
edc0: 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73   notReady, 0, &s
edd0: 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20  TermCost);.     
ede0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ee00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ee10: 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43  rTotal += sTermC
ee20: 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20  ost.rCost;.     
ee30: 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d     nRow += sTerm
ee40: 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20 20 20 20 20  Cost.nRow;.     
ee50: 20 20 20 75 73 65 64 20 7c 3d 20 73 54 65 72 6d     used |= sTerm
ee60: 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20  Cost.used;.     
ee70: 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70     if( rTotal>=p
ee80: 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72  Cost->rCost ) br
ee90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
eea0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
eeb0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
eec0: 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20  lause, increase 
eed0: 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f  the scan cost to
eee0: 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20   account .      
eef0: 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20  ** for the cost 
ef00: 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a  of the sort. */.
ef10: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
ef20: 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By!=0 ){.       
ef30: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
ef40: 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
ef50: 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67  ses OR cost %.9g
ef60: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20   to %.9g\n",.   
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b   rTotal, rTotal+
ef90: 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77  nRow*estLog(nRow
efa0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f  )));.        rTo
efb0: 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c  tal += nRow*estL
efc0: 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20  og(nRow);.      
efd0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
efe0: 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e  he cost of scann
eff0: 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f  ing using this O
f000: 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d  R term for optim
f010: 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  ization is.     
f020: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
f030: 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73  e current cost s
f040: 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20  tored in pCost, 
f050: 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  replace the cont
f060: 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ents.      ** of
f070: 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20   pCost. */.     
f080: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
f090: 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
f0a0: 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
f0b0: 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c  %.9g\n", rTotal,
f0c0: 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
f0d0: 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d  f( rTotal<pCost-
f0e0: 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  >rCost ){.      
f0f0: 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
f100: 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
f110: 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e   pCost->nRow = n
f120: 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Row;.        pCo
f130: 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b  st->used = used;
f140: 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
f150: 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66  plan.wsFlags = f
f160: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43  lags;.        pC
f170: 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72  ost->plan.u.pTer
f180: 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
f190: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f1a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f1b0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
f1c0: 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
f1d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f1e0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
f1f0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
f200: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
f210: 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73  se term pTerm is
f220: 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65   of a form where
f230: 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20   it.** could be 
f240: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
f250: 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72  ex to access pSr
f260: 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61  c, assuming an a
f270: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e  ppropriate.** in
f280: 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a  dex existed..*/.
f290: 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43  static int termC
f2a0: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20  anDriveIndex(.  
f2b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f2c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f2d0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
f2e0: 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  erm to check */.
f2f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
f300: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
f310: 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65   /* Table we are
f320: 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73   trying to acces
f330: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  s */.  Bitmask n
f340: 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20  otReady         
f350: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
f360: 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f  in outer loops o
f370: 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b  f the join */.){
f380: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69  .  char aff;.  i
f390: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
f3a0: 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72  rsor!=pSrc->iCur
f3b0: 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  sor ) return 0;.
f3c0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
f3d0: 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20  erator!=WO_EQ ) 
f3e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f3f0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
f400: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21  ght & notReady)!
f410: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f420: 20 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61   aff = pSrc->pTa
f430: 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75  b->aCol[pTerm->u
f440: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66  .leftColumn].aff
f450: 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71  inity;.  if( !sq
f460: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
f470: 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70  tyOk(pTerm->pExp
f480: 72 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e  r, aff) ) return
f490: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
f4a0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
f4b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f4c0: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
f4d0: 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
f4e0: 20 70 6c 61 6e 20 66 6f 72 20 70 53 72 63 20 73   plan for pSrc s
f4f0: 70 65 63 69 66 69 65 64 20 69 6e 20 70 43 6f 73  pecified in pCos
f500: 74 20 69 73 20 61 20 66 75 6c 6c 20 74 61 62 6c  t is a full tabl
f510: 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e  e scan.** and in
f520: 64 65 78 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73  dexing is allows
f530: 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f   (if there is no
f540: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
f550: 75 73 65 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70  use) and it.** p
f560: 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74  ossible to const
f570: 72 75 63 74 20 61 20 74 72 61 6e 73 69 65 6e 74  ruct a transient
f580: 20 69 6e 64 65 78 20 74 68 61 74 20 77 6f 75 6c   index that woul
f590: 64 20 70 65 72 66 6f 72 6d 20 62 65 74 74 65 72  d perform better
f5a0: 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  .** than a full 
f5b0: 74 61 62 6c 65 20 73 63 61 6e 20 65 76 65 6e 20  table scan even 
f5c0: 77 68 65 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  when the cost of
f5d0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68   constructing th
f5e0: 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61  e index.** is ta
f5f0: 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74  ken into account
f600: 2c 20 74 68 65 6e 20 61 6c 74 65 72 20 74 68 65  , then alter the
f610: 20 71 75 65 72 79 20 70 6c 61 6e 20 74 6f 20 75   query plan to u
f620: 73 65 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69  se the.** transi
f630: 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ent index..*/.st
f640: 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 41 75  atic void bestAu
f650: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
f660: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f680: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
f690: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
f6a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
f6b0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
f6c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
f6d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f6e0: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
f6f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
f700: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
f710: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
f720: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
f730: 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
f740: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
f750: 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
f760: 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20  Cost *pCost     
f770: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74         /* Lowest
f780: 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e   cost query plan
f790: 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20   */.){.  double 
f7a0: 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20 20 20 20  nTableRow;      
f7b0: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20       /* Rows in 
f7c0: 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65 20  the input table 
f7d0: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  */.  double logN
f7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7f0: 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f   /* log(nTableRo
f800: 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63  w) */.  double c
f810: 6f 73 74 54 65 6d 70 49 64 78 3b 20 20 20 20 20  ostTempIdx;     
f820: 20 20 20 20 2f 2a 20 70 65 72 2d 71 75 65 72 79      /* per-query
f830: 20 63 6f 73 74 20 6f 66 20 74 68 65 20 74 72 61   cost of the tra
f840: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a  nsient index */.
f850: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f860: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
f870: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
f880: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
f890: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
f8a0: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
f8b0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
f8c0: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c  C->a[] */.  Tabl
f8d0: 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20  e *pTable;      
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
f8f0: 20 74 68 74 20 6d 69 67 68 74 20 62 65 20 69 6e   tht might be in
f900: 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20  dexed */..  if( 
f910: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
f920: 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f  gs & SQLITE_Auto
f930: 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20  Index)==0 ){.   
f940: 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
f950: 64 69 63 65 73 20 61 72 65 20 64 69 73 61 62 6c  dices are disabl
f960: 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a  ed at run-time *
f970: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
f980: 7d 0a 20 20 69 66 28 20 28 70 43 6f 73 74 2d 3e  }.  if( (pCost->
f990: 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
f9a0: 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
f9b0: 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  N)!=0 ){.    /* 
f9c0: 57 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  We already have 
f9d0: 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 64  some kind of ind
f9e0: 65 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74 68  ex in use for th
f9f0: 69 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20  is query. */.   
fa00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
fa10: 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
fa20: 78 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  xed ){.    /* Th
fa30: 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  e NOT INDEXED cl
fa40: 61 75 73 65 20 61 70 70 65 61 72 73 20 69 6e 20  ause appears in 
fa50: 74 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20 20  the SQL. */.    
fa60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
fa70: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
fa80: 51 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f  QueryLoop >= (do
fa90: 75 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62  uble)1 );.  pTab
faa0: 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
fab0: 0a 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70  .  nTableRow = p
fac0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a  Table->nRowEst;.
fad0: 20 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28    logN = estLog(
fae0: 6e 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f  nTableRow);.  co
faf0: 73 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f  stTempIdx = 2*lo
fb00: 67 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50  gN*(nTableRow/pP
fb10: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
fb20: 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73   + 1);.  if( cos
fb30: 74 54 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d  tTempIdx>=pCost-
fb40: 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >rCost ){.    /*
fb50: 20 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65   The cost of cre
fb60: 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ating the transi
fb70: 65 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20  ent table would 
fb80: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  be greater than.
fb90: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65      ** doing the
fba0: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
fbb0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
fbc0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
fbd0: 20 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74   for any equalit
fbe0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72  y comparison ter
fbf0: 6d 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20  m */.  pWCEnd = 
fc00: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
fc10: 72 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  rm];.  for(pTerm
fc20: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
fc30: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
fc40: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
fc50: 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
fc60: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
fc70: 29 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  ) ){.      WHERE
fc80: 54 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64  TRACE(("auto-ind
fc90: 65 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ex reduces cost 
fca0: 66 72 6f 6d 20 25 2e 32 66 20 74 6f 20 25 2e 32  from %.2f to %.2
fcb0: 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  f\n",.          
fcc0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d            pCost-
fcd0: 3e 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70  >rCost, costTemp
fce0: 49 64 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f  Idx));.      pCo
fcf0: 73 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74  st->rCost = cost
fd00: 54 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70  TempIdx;.      p
fd10: 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6c 6f 67  Cost->nRow = log
fd20: 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f  N + 1;.      pCo
fd30: 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
fd40: 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   = WHERE_TEMP_IN
fd50: 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  DEX;.      pCost
fd60: 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e  ->used = pTerm->
fd70: 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
fd80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fd90: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
fda0: 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74  fine bestAutomat
fdb0: 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c  icIndex(A,B,C,D,
fdc0: 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  E)  /* no-op */.
fdd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fde0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
fdf0: 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64  INDEX */...#ifnd
fe00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fe10: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
fe20: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
fe30: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
fe40: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
fe50: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
fe60: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
fe70: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
fe80: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
fe90: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
fea0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
feb0: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
fec0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
fed0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
fee0: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
fef0: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
ff00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ff20: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
ff30: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
ff40: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
ff50: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
ff60: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
ff70: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ff80: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
ff90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
ffa0: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
ffb0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
ffc0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
ffd0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
ffe0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
fff0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
10000 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
10010 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
10020 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
10030 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
10040 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20  .  int nColumn; 
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10060 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
10070 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
10080 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
10090 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
100a0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
100b0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
100c0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
100d0 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
100e0 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
100f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
10100 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  C->a[] */.  int 
10110 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
10120 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
10130 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
10140 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49   for pIdx */.  I
10150 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
10170 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
10180 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
10190 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
101a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
101b0 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
101c0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
101d0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
101e0 0a 20 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74  .  int regIsInit
101f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10200 2a 20 52 65 67 69 73 74 65 72 20 73 65 74 20 62  * Register set b
10210 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
10220 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
10230 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
10240 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10250 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10260 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a  on bypass jump *
10270 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  /.  Table *pTabl
10280 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10290 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
102a0 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ng indexed */.  
102b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66  KeyInfo *pKeyinf
102c0 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  o;          /* K
102d0 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ey information f
102e0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20  or the index */ 
102f0 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70    .  int addrTop
10300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10310 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
10320 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
10330 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
10340 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
10350 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10360 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
10370 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
103a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
103b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
103c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
103d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
103e0 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
103f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
10400 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
10410 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
10420 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10440 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
10450 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
10460 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  n */.  Bitmask i
10470 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
10480 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
10490 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
104a0 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
104b0 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
104c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
104d0 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
104e0 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  al columns */.. 
104f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
10500 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
10510 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
10520 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
10530 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
10540 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
10550 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
10560 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
10570 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
10580 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10590 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
105a0 29 3b 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d  );.  regIsInit =
105b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
105c0 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71  .  addrInit = sq
105d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
105e0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49  v, OP_If, regIsI
105f0 6e 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nit);.  sqlite3V
10600 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10610 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49  Integer, 1, regI
10620 73 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f  sInit);..  /* Co
10630 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
10640 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  f columns that w
10650 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
10660 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61  the index.  ** a
10670 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  nd used to match
10680 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
10690 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e  nstraints */.  n
106a0 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54  Column = 0;.  pT
106b0 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
106c0 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70  b;.  pWCEnd = &p
106d0 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
106e0 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  ];.  idxCols = 0
106f0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
10700 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
10710 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
10720 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
10730 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
10740 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
10750 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
10760 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
10770 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
10780 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
10790 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
107a0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
107b0 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
107c0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  iCol;.      test
107d0 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
107e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
107f0 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
10800 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
10810 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
10820 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   ){.        nCol
10830 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  umn++;.        i
10840 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
10850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10860 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
10870 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76  lumn>0 );.  pLev
10880 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  el->plan.nEq = n
10890 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f  Column;..  /* Co
108a0 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
108b0 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
108c0 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
108d0 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
108e0 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
108f0 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
10900 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
10910 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
10920 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
10930 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
10940 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
10950 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
10960 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
10970 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
10980 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
10990 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
109a0 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
109b0 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
109c0 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
109d0 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
109e0 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
109f0 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
10a00 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
10a10 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
10a20 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
10a30 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
10a40 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
10a50 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
10a60 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
10a70 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
10a80 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61  xCols | (((Bitma
10a90 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29  sk)1)<<(BMS-1)))
10aa0 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28  ;.  mxBitCol = (
10ab0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20  pTable->nCol >= 
10ac0 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a  BMS-1) ? BMS-1 :
10ad0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20   pTable->nCol;. 
10ae0 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
10af0 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
10b00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
10b10 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
10b20 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
10b30 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
10b40 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
10b50 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b  ols & (((Bitmask
10b60 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d  )1)<<i) ) nColum
10b70 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n++;.  }.  if( p
10b80 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
10b90 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
10ba0 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43  MS-1)) ){.    nC
10bb0 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d  olumn += pTable-
10bc0 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
10bd0 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  .  }.  pLevel->p
10be0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
10bf0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c  HERE_COLUMN_EQ |
10c00 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
10c10 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43  | WO_EQ;..  /* C
10c20 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
10c30 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
10c40 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
10c50 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   */.  nByte = si
10c60 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e  zeof(Index);.  n
10c70 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a  Byte += nColumn*
10c80 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20  sizeof(int);    
10c90 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
10ca0 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d  mn */.  nByte +=
10cb0 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28   nColumn*sizeof(
10cc0 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64  char*);   /* Ind
10cd0 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e  ex.azColl */.  n
10ce0 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b  Byte += nColumn;
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
10d10 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d  rder */.  pIdx =
10d20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10d30 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
10d40 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70   nByte);.  if( p
10d50 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
10d60 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  .  pLevel->plan.
10d70 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
10d80 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
10d90 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d  (char**)&pIdx[1]
10da0 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
10db0 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78  mn = (int*)&pIdx
10dc0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e  ->azColl[nColumn
10dd0 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  ];.  pIdx->aSort
10de0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
10df0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  dx->aiColumn[nCo
10e00 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a  lumn];.  pIdx->z
10e10 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64  Name = "auto-ind
10e20 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  ex";.  pIdx->nCo
10e30 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  lumn = nColumn;.
10e40 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d    pIdx->pTable =
10e50 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30   pTable;.  n = 0
10e60 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b  ;.  idxCols = 0;
10e70 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
10e80 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
10e90 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
10ea0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
10eb0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
10ec0 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
10ed0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
10ee0 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
10ef0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74  olumn;.      Bit
10f00 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f  mask cMask = iCo
10f10 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61  l>=BMS ? ((Bitma
10f20 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a  sk)1)<<(BMS-1) :
10f30 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
10f40 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Col;.      if( (
10f50 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
10f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
10f70 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
10f80 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
10f90 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
10fa0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
10fb0 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54  aiColumn[n] = pT
10fc0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
10fd0 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  n;.        pColl
10fe0 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
10ff0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
11000 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
11010 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
11020 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
11030 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 2d 3e  oll[n] = pColl->
11040 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6e  zName;.        n
11050 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
11060 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
11070 28 75 33 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e  (u32)n==pLevel->
11080 70 6c 61 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  plan.nEq );..  /
11090 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
110a0 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
110b0 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
110c0 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
110d0 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
110e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
110f0 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
11100 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
11110 78 74 72 61 43 6f 6c 73 20 26 20 28 28 28 42 69  xtraCols & (((Bi
11120 74 6d 61 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a  tmask)1)<<i) ){.
11130 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
11140 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
11150 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
11160 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  n] = "BINARY";. 
11170 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
11180 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
11190 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
111a0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
111b0 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
111c0 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
111d0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
111e0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
111f0 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
11200 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
11210 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
11220 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
11230 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f    assert( n==nCo
11240 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72  lumn );..  /* Cr
11250 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
11260 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b  ic index */.  pK
11270 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyinfo = sqlite3
11280 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
11290 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73  rse, pIdx);.  as
112a0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
112b0 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71  dxCur>=0 );.  sq
112c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
112d0 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  v, OP_OpenAutoin
112e0 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  dex, pLevel->iId
112f0 78 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c  xCur, nColumn+1,
11300 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11310 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11320 4b 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  Keyinfo, P4_KEYI
11330 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
11340 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11350 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65  "for %s", pTable
11360 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a  ->zName));..  /*
11370 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61   Fill the automa
11380 74 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63  tic index with c
11390 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  ontent */.  addr
113a0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
113b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
113c0 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  wind, pLevel->iT
113d0 61 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63  abCur);.  regRec
113e0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
113f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
11400 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
11410 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
11420 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
11430 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
11440 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ord, 1);.  sqlit
11450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11460 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c  OP_IdxInsert, pL
11470 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72  evel->iIdxCur, r
11480 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
11490 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
114a0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
114b0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
114c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
114d0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65  , OP_Next, pLeve
114e0 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72  l->iTabCur, addr
114f0 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Top+1);.  sqlite
11500 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11510 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
11520 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
11530 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11540 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
11550 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
11560 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11570 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
11580 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
11590 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
115a0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
115b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
115c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
115d0 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
115e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
115f0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
11600 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
11610 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11620 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
11630 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
11640 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
11650 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
11660 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
11670 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11680 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11690 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
116a0 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
116b0 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
116c0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
116d0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
116e0 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
116f0 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
11700 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
11710 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
11720 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
11730 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 68 65   *pParse, .  Whe
11740 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20  reClause *pWC,. 
11750 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
11760 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78  item *pSrc,.  Ex
11770 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11780 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
11790 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73    int nTerm;.  s
117a0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
117b0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
117c0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
117d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
117e0 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
117f0 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
11800 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
11810 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
11820 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
11830 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
11840 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71  t nOrderBy;.  sq
11850 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
11860 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57   *pIdxInfo;..  W
11870 48 45 52 45 54 52 41 43 45 28 28 22 52 65 63 6f  HERETRACE(("Reco
11880 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  mputing index in
11890 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c  fo for %s...\n",
118a0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
118b0 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  me));..  /* Coun
118c0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
118d0 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20 63  possible WHERE c
118e0 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
118f0 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a  s referring.  **
11900 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
11910 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
11920 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d  i=nTerm=0, pTerm
11930 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
11940 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
11950 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
11960 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
11970 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
11980 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11990 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
119a0 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72  >eOperator&(pTer
119b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29  m->eOperator-1))
119c0 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
119d0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
119e0 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a  rator==WO_IN );.
119f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
11a00 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
11a10 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
11a20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
11a30 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
11a40 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
11a50 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b  inue;.    nTerm+
11a60 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
11a70 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11a80 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  use contains onl
11a90 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  y columns in the
11aa0 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76   current .  ** v
11ab0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65  irtual table the
11ac0 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  n allocate space
11ad0 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42   for the aOrderB
11ae0 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74  y part of.  ** t
11af0 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
11b00 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  _info structure.
11b10 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79  .  */.  nOrderBy
11b20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64   = 0;.  if( pOrd
11b30 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
11b40 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
11b50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11b60 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
11b70 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11b80 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
11b90 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11ba0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
11bb0 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
11bc0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
11bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
11be0 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  =pOrderBy->nExpr
11bf0 20 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72   ){.      nOrder
11c00 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
11c10 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
11c20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
11c30 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
11c40 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
11c50 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20    */.  pIdxInfo 
11c60 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11c70 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
11c80 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e  , sizeof(*pIdxIn
11c90 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo).            
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
11cb0 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f   (sizeof(*pIdxCo
11cc0 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55  ns) + sizeof(*pU
11cd0 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20  sage))*nTerm.   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
11d00 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a 6e  (*pIdxOrderBy)*n
11d10 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66 28  OrderBy );.  if(
11d20 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
11d30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11d40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
11d50 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
11d60 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49    /* (double)0 I
11d70 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
11d80 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
11d90 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72  OINT... */.    r
11da0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
11db0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11dc0 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
11dd0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
11de0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
11df0 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
11e00 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
11e10 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
11e20 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
11e30 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
11e40 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
11e50 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
11e60 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
11e70 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
11e80 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
11e90 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
11ea0 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
11eb0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
11ec0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
11ed0 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
11ee0 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
11ef0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
11f00 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
11f10 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
11f20 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
11f30 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11f40 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
11f50 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
11f60 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
11f70 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
11f80 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
11f90 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
11fa0 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
11fb0 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
11fc0 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
11fd0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
11fe0 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
11ff0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
12000 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
12010 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
12020 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
12030 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
12040 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
12050 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
12060 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12070 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
12080 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
12090 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
120e0 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
120f0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
12100 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
12110 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
12120 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
12130 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
12140 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
12150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
12160 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
12170 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
12180 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  r-1))==0 );.    
12190 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
121a0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
121b0 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
121c0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
121d0 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
121e0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
121f0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
12200 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29  _IN|WO_ISNULL) )
12210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
12220 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
12230 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  mn = pTerm->u.le
12240 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49  ftColumn;.    pI
12250 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
12260 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 70  ffset = i;.    p
12270 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
12280 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72  (u8)pTerm->eOper
12290 61 74 6f 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65  ator;.    /* The
122a0 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
122b0 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
122c0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
122d0 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
122e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
122f0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
12300 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
12310 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
12320 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
12330 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
12340 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
12350 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
12360 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
12370 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12380 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
12390 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
123a0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
123b0 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
123c0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
123d0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
123e0 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
123f0 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
12400 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12410 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
12420 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
12430 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12440 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
12450 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
12460 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
12470 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
12480 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
12490 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
124a0 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  (WO_EQ|WO_LT|WO_
124b0 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
124c0 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
124d0 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  j++;.  }.  for(i
124e0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
124f0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
12500 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
12510 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
12520 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
12530 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  .iColumn = pExpr
12540 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
12550 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  IdxOrderBy[i].de
12560 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  sc = pOrderBy->a
12570 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
12580 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64   }..  return pId
12590 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
125a0 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
125b0 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
125c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
125d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
125e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
125f0 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
12600 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
12610 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
12620 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
12630 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
12640 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
12650 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
12660 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70  te3_index_info p
12670 6f 69 6e 74 65 72 20 70 61 73 73 65 64 0a 2a 2a  ointer passed.**
12680 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
12690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
126a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
126b0 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
126c0 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
126d0 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
126e0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
126f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
12700 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
12710 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
12720 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
12730 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
12740 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
12750 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
12760 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
12770 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
12780 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
12790 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
127a0 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
127b0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
127c0 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
127d0 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
127e0 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
127f0 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
12800 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
12810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
12820 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
12830 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
12840 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
12850 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
12860 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
12870 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
12880 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
12890 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
128a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
128b0 20 72 63 3b 0a 0a 20 20 57 48 45 52 45 54 52 41   rc;..  WHERETRA
128c0 43 45 28 28 22 78 42 65 73 74 49 6e 64 65 78 20  CE(("xBestIndex 
128d0 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d  for %s\n", pTab-
128e0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52 41 43  >zName));.  TRAC
128f0 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29 3b  E_IDX_INPUTS(p);
12900 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
12910 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
12920 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20 20  ex(pVtab, p);.  
12930 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
12940 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  S(p);..  if( rc!
12950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12970 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
12980 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
12990 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
129a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
129b0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
129c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
129d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
129e0 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
129f0 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
12a00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12a10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12a20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
12a30 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
12a40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12a50 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
12a60 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
12a70 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
12a80 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
12a90 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
12aa0 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69  f( !p->aConstrai
12ab0 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
12ac0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
12ad0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
12ae0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
12af0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12b00 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
12b10 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49  table %s: xBestI
12b20 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e  ndex returned an
12b30 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20   invalid plan", 
12b40 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
12b50 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
12b60 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  n pParse->nErr;.
12b70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
12b80 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
12b90 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74   for a virtual t
12ba0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
12bb0 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f  best index is co
12bc0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42  mputed by the xB
12bd0 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20  estIndex method 
12be0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  of the virtual.*
12bf0 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20  * table module. 
12c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c10 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77   really just a w
12c20 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73  rapper that sets
12c30 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   up.** the sqlit
12c40 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
12c50 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
12c60 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63  used to communic
12c70 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73  ate with.** xBes
12c80 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e  tIndex..**.** In
12c90 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f   a join, this ro
12ca0 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63  utine might be c
12cb0 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  alled multiple t
12cc0 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  imes for the.** 
12cd0 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62  same virtual tab
12ce0 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  le.  The sqlite3
12cf0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
12d00 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
12d10 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
12d20 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74  zed on the first
12d30 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20   invocation and 
12d40 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75  reused on all su
12d50 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f  bsequent.** invo
12d60 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71  cations.  The sq
12d70 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12d80 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
12d90 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20  so used when.** 
12da0 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
12db0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  d to access the 
12dc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
12dd0 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c  The whereInfoDel
12de0 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e  ete() .** routin
12df0 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  e takes care of 
12e00 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69  freeing the sqli
12e10 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
12e20 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a  tructure after.*
12e30 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20  * everybody has 
12e40 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74  finished with it
12e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12e60 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
12e70 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12e80 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12e90 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
12ea0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12eb0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
12ec0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
12ed0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
12ee0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
12ef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
12f00 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Src,      /* The
12f10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
12f20 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
12f30 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
12f40 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
12f50 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
12f60 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
12f70 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
12f80 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12f90 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  By,             
12fa0 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20  /* The order by 
12fb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
12fc0 65 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20 20  eCost *pCost,   
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12fe0 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
12ff0 20 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74   plan */.  sqlit
13000 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
13010 70 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e  ppIdxInfo  /* In
13020 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  dex information 
13030 70 61 73 73 65 64 20 74 6f 20 78 42 65 73 74 49  passed to xBestI
13040 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ndex */.){.  Tab
13050 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d  le *pTab = pSrc-
13060 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  >pTab;.  sqlite3
13070 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
13080 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  xInfo;.  struct 
13090 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
130a0 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f  nstraint *pIdxCo
130b0 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  ns;.  struct sql
130c0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
130d0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
130e0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
130f0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
13100 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
13110 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72 43  rBy;.  double rC
13120 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ost;..  /* Make 
13130 73 75 72 65 20 77 73 46 6c 61 67 73 20 69 73 20  sure wsFlags is 
13140 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 73  initialized to s
13150 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e 20  ome sane value. 
13160 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
13170 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69  e .  ** malloc i
13180 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49  n allocateIndexI
13190 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64 20  nfo() fails and 
131a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
131b0 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20  turns leaving.  
131c0 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61 6e  ** wsFlags in an
131d0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
131e0 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65 72  tate, the caller
131f0 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70 72   may behave unpr
13200 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a  edictably..  */.
13210 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c 20    memset(pCost, 
13220 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  0, sizeof(*pCost
13230 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61  ));.  pCost->pla
13240 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  n.wsFlags = WHER
13250 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
13260 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
13270 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
13280 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
13290 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
132a0 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
132b0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
132c0 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  , then allocate 
132d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
132e0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49  t now..  */.  pI
132f0 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49  dxInfo = *ppIdxI
13300 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nfo;.  if( pIdxI
13310 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  nfo==0 ){.    *p
13320 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78 49  pIdxInfo = pIdxI
13330 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
13340 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
13350 70 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64 65  pWC, pSrc, pOrde
13360 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rBy);.  }.  if( 
13370 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
13380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
13390 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
133a0 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nt, the sqlite3_
133b0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
133c0 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e  ture that pIdxIn
133d0 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74  fo points.  ** t
133e0 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  o will have been
133f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69   initialized, ei
13400 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20  ther during the 
13410 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
13420 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e  on or.  ** durin
13430 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76  g some prior inv
13440 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65  ocation.  Now we
13450 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75   just have to cu
13460 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a  stomize the.  **
13470 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78   details of pIdx
13480 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72  Info for the cur
13490 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
134a0 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20  and pass it to. 
134b0 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a   ** xBestIndex..
134c0 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    */..  /* The m
134d0 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  odule name must 
134e0 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f  be defined. Also
134f0 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20  , by this point 
13500 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20  there must.  ** 
13510 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
13520 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
13530 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72  structure. Other
13540 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  wise.  ** sqlite
13550 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
13560 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65  mes() would have
13570 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65   picked up the e
13580 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  rror. .  */.  as
13590 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f  sert( pTab->azMo
135a0 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d  duleArg && pTab-
135b0 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20  >azModuleArg[0] 
135c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
135d0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
135e0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 20  arse->db, pTab) 
135f0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
13600 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
13610 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
13620 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
13630 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  .  ** output var
13640 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a  iables to zero..
13650 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74    **.  ** aConst
13660 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69  raint[].usable i
13670 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74  s true for const
13680 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65  raints where the
13690 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a   right-hand.  **
136a0 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
136b0 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
136c0 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
136d0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
136e0 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
136f0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
13700 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
13710 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
13720 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
13730 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20         column = 
13740 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  expr.  **.  ** a
13750 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  nd we are evalua
13760 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65  ting a join, the
13770 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
13780 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20   on column is . 
13790 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
137a0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
137b0 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
137c0 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
137d0 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  t.  ** of the ta
137e0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
137f0 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  olumn..  **.  **
13800 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
13810 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  s[] array contai
13820 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
13830 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ll constraints. 
13840 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65   ** on the curre
13850 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20  nt table.  That 
13860 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65  way we only have
13870 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f   to compute it o
13880 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  nce.  ** even th
13890 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72  ough we might tr
138a0 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65  y to pick the be
138b0 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c  st index multipl
138c0 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f  e times..  ** Fo
138d0 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
138e0 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
138f0 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
13900 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
13910 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62   ** join might b
13920 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77  e different so w
13930 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70  e have to recomp
13940 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66  ute the usable f
13950 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69  lag.  ** each ti
13960 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  me..  */.  pIdxC
13970 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
13980 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13990 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
139a0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
139b0 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
139c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
139d0 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
139e0 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
139f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
13a00 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
13a10 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
13a20 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
13a30 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
13a40 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
13a50 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
13a60 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
13a70 26 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20 3a  &notReady) ? 0 :
13a80 20 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   1;.  }.  memset
13a90 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
13aa0 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
13ab0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
13ac0 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78  int);.  if( pIdx
13ad0 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
13ae0 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71  IdxStr ){.    sq
13af0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
13b00 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
13b10 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  }.  pIdxInfo->id
13b20 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
13b30 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
13b40 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  ;.  pIdxInfo->ne
13b50 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
13b60 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
13b70 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
13b80 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62  = 0;.  /* ((doub
13b90 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f 66  le)2) In case of
13ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13bb0 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
13bc0 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  /.  pIdxInfo->es
13bd0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51  timatedCost = SQ
13be0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28  LITE_BIG_DBL / (
13bf0 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f  (double)2);.  nO
13c00 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66  rderBy = pIdxInf
13c10 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  o->nOrderBy;.  i
13c20 66 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b 0a  f( !pOrderBy ){.
13c30 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
13c40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
13c50 0a 20 20 69 66 28 20 76 74 61 62 42 65 73 74 49  .  if( vtabBestI
13c60 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
13c70 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a  b, pIdxInfo) ){.
13c80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13c90 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
13ca0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13cb0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
13cc0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
13cd0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
13ce0 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
13cf0 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
13d00 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73 61  +){.    if( pUsa
13d10 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
13d20 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73 74  0 ){.      pCost
13d30 2d 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61  ->used |= pWC->a
13d40 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65  [pIdxCons[i].iTe
13d50 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71  rmOffset].prereq
13d60 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
13d70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
13d80 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
13d90 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 73  lause, and the s
13da0 65 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c 20  elected virtual 
13db0 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a 2a  table index.  **
13dc0 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66   does not satisf
13dd0 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20 74  y it, increase t
13de0 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
13df0 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  can accordingly.
13e00 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63 68   This.  ** match
13e10 65 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  es the processin
13e20 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75 61  g for non-virtua
13e30 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73 74  l tables in best
13e40 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20 20  BtreeIndex()..  
13e50 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49 64  */.  rCost = pId
13e60 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
13e70 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64  Cost;.  if( pOrd
13e80 65 72 42 79 20 26 26 20 70 49 64 78 49 6e 66 6f  erBy && pIdxInfo
13e90 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
13ea0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f 73  d==0 ){.    rCos
13eb0 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f 73  t += estLog(rCos
13ec0 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a 20  t)*rCost;.  }.. 
13ed0 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20   /* The cost is 
13ee0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
13ef0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  e larger than SQ
13f00 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68  LITE_BIG_DBL (th
13f10 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61  e.  ** inital va
13f20 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73  lue of lowestCos
13f30 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20  t in this loop. 
13f40 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  If it is, then t
13f50 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f  he.  ** (cost<lo
13f60 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62  westCost) test b
13f70 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20  elow will never 
13f80 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20  be true..  ** . 
13f90 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65   ** Use "(double
13fa0 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  )2" instead of "
13fb0 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49  2.0" in case OMI
13fc0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
13fd0 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65   .  ** is define
13fe0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53  d..  */.  if( (S
13ff0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
14000 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73 74  double)2))<rCost
14010 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72   ){.    pCost->r
14020 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42  Cost = (SQLITE_B
14030 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29  IG_DBL/((double)
14040 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2));.  }else{.  
14050 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
14060 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70 43   rCost;.  }.  pC
14070 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61  ost->plan.u.pVta
14080 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f 3b  bIdx = pIdxInfo;
14090 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
140a0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
140b0 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70   ){.    pCost->p
140c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
140d0 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
140e0 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  }.  pCost->plan.
140f0 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  nEq = 0;.  pIdxI
14100 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
14110 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  nOrderBy;..  /* 
14120 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d 6f  Try to find a mo
14130 72 65 20 65 66 66 69 63 69 65 6e 74 20 61 63 63  re efficient acc
14140 65 73 73 20 70 61 74 74 65 72 6e 20 62 79 20 75  ess pattern by u
14150 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e  sing multiple in
14160 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f 70  dexes.  ** to op
14170 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78 70  timize an OR exp
14180 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74  ression within t
14190 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
141a0 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72 43   .  */.  bestOrC
141b0 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73  lauseIndex(pPars
141c0 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
141d0 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
141e0 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64  , pCost);.}.#end
141f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14200 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14210 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  /../*.** Argumen
14220 74 20 70 49 64 78 20 69 73 20 61 20 70 6f 69 6e  t pIdx is a poin
14230 74 65 72 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ter to an index 
14240 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
14250 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a  as an array of.*
14260 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  * SQLITE_INDEX_S
14270 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79 20 73 70  AMPLES evenly sp
14280 61 63 65 64 20 73 61 6d 70 6c 65 73 20 6f 66 20  aced samples of 
14290 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 65  the first indexe
142a0 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72  d column.** stor
142b0 65 64 20 69 6e 20 49 6e 64 65 78 2e 61 53 61 6d  ed in Index.aSam
142c0 70 6c 65 2e 20 54 68 65 20 64 6f 6d 61 69 6e 20  ple. The domain 
142d0 6f 66 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  of values stored
142e0 20 69 6e 20 73 61 69 64 20 63 6f 6c 75 6d 6e 0a   in said column.
142f0 2a 2a 20 6d 61 79 20 62 65 20 74 68 6f 75 67 68  ** may be though
14300 74 20 6f 66 20 61 73 20 64 69 76 69 64 65 64 20  t of as divided 
14310 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e 44  into (SQLITE_IND
14320 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72 65  EX_SAMPLES+1) re
14330 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e  gions..** Region
14340 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20   0 contains all 
14350 76 61 6c 75 65 73 20 73 6d 61 6c 6c 65 72 20 74  values smaller t
14360 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 73 61  han the first sa
14370 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67 69  mple value. Regi
14380 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e 73  on.** 1 contains
14390 20 76 61 6c 75 65 73 20 6c 61 72 67 65 72 20 74   values larger t
143a0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
143b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
143c0 20 66 69 72 73 74 20 73 61 6d 70 6c 65 2c 0a 2a   first sample,.*
143d0 2a 20 62 75 74 20 73 6d 61 6c 6c 65 72 20 74 68  * but smaller th
143e0 61 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  an the value of 
143f0 74 68 65 20 73 65 63 6f 6e 64 2e 20 41 6e 64 20  the second. And 
14400 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  so on..**.** If 
14410 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
14420 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
14430 69 6e 65 73 20 77 68 69 63 68 20 6f 66 20 74 68  ines which of th
14440 65 20 72 65 67 69 6f 6e 73 20 76 61 6c 75 65 20  e regions value 
14450 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73 20 69 6e  .** pVal lies in
14460 2c 20 73 65 74 73 20 2a 70 69 52 65 67 69 6f 6e  , sets *piRegion
14470 20 74 6f 20 74 68 65 20 72 65 67 69 6f 6e 20 69   to the region i
14480 6e 64 65 78 20 28 61 20 76 61 6c 75 65 20 62 65  ndex (a value be
14490 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53  tween 0.** and S
144a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
144b0 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65  LES+1, inclusive
144c0 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  ) and returns SQ
144d0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
144e0 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  if an OOM occurs
144f0 20 77 68 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e   while convertin
14500 67 20 74 65 78 74 20 76 61 6c 75 65 73 20 62 65  g text values be
14510 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c  tween encodings,
14520 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
14530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14540 20 2a 70 69 52 65 67 69 6f 6e 20 69 73 20 75 6e   *piRegion is un
14550 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64  defined..*/.#ifd
14560 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14570 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e  _STAT2.static in
14580 74 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  t whereRangeRegi
14590 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
145a0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
145b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
145c0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
145d0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
145e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
145f0 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
14600 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71  omain of */.  sq
14610 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14620 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l,        /* Val
14630 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  ue to consider *
14640 2f 0a 20 20 69 6e 74 20 2a 70 69 52 65 67 69 6f  /.  int *piRegio
14650 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
14660 2f 2a 20 4f 55 54 3a 20 52 65 67 69 6f 6e 20 6f  /* OUT: Region o
14670 66 20 64 6f 6d 61 69 6e 20 69 6e 20 77 68 69 63  f domain in whic
14680 68 20 76 61 6c 75 65 20 6c 69 65 73 20 2a 2f 0a  h value lies */.
14690 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
146a0 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  pVal) ){.    Ind
146b0 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
146c0 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
146d0 65 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30  e;.    int i = 0
146e0 3b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 20  ;.    int eType 
146f0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14700 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 20  type(pVal);..   
14710 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
14720 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54  TE_INTEGER || eT
14730 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ype==SQLITE_FLOA
14740 54 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  T ){.      doubl
14750 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
14760 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29  lue_double(pVal)
14770 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14780 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   i<SQLITE_INDEX_
14790 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20  SAMPLES; i++){. 
147a0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
147b0 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
147c0 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
147d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
147e0 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
147f0 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c  e>=SQLITE_TEXT |
14800 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  | aSample[i].u.r
14810 3e 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >r ) break;.    
14820 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 20 0a    }.    }else{ .
14830 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
14840 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14850 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14860 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Coll;.      cons
14870 74 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 20 69  t u8 *z;.      i
14880 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nt n;..      /* 
14890 70 56 61 6c 20 63 6f 6d 65 73 20 66 72 6f 6d 20  pVal comes from 
148a0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
148b0 45 78 70 72 28 29 20 73 6f 20 74 68 65 20 74 79  Expr() so the ty
148c0 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  pe cannot be NUL
148d0 4c 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  L */.      asser
148e0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
148f0 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d  _TEXT || eType==
14900 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a  SQLITE_BLOB );..
14910 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
14920 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
14930 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e          z = (con
14940 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f  st u8 *)sqlite3_
14950 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29  value_blob(pVal)
14960 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
14970 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
14980 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14990 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c   pColl->enc==SQL
149a0 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20  ITE_UTF8 );.    
149b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
149c0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
149d0 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  GetCollSeq(db, S
149e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a  QLITE_UTF8, 0, *
149f0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
14a00 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
14a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14a30 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
14a40 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
14a50 65 6e 63 65 3a 20 25 73 22 2c 0a 20 20 20 20 20  ence: %s",.     
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f       *pIdx->azCo
14a80 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ll);.          r
14a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14aa0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
14ab0 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
14ac0 20 75 38 20 2a 29 73 71 6c 69 74 65 33 56 61 6c   u8 *)sqlite3Val
14ad0 75 65 54 65 78 74 28 70 56 61 6c 2c 20 70 43 6f  ueText(pVal, pCo
14ae0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20  ll->enc);.      
14af0 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20    if( !z ){.    
14b00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14b10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
14b30 65 72 74 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20  ert( z && pColl 
14b40 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b60 6e 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  n = sqlite3Value
14b70 42 79 74 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c  Bytes(pVal, pCol
14b80 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20 20 20 20 20  l->enc);..      
14b90 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
14ba0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
14bb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
14bc0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt r;.        in
14bd0 74 20 65 53 61 6d 70 6c 65 74 79 70 65 20 3d 20  t eSampletype = 
14be0 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
14bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53  ;.        if( eS
14c00 61 6d 70 6c 65 74 79 70 65 3d 3d 53 51 4c 49 54  ampletype==SQLIT
14c10 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c  E_NULL || eSampl
14c20 65 74 79 70 65 3c 65 54 79 70 65 20 29 20 63 6f  etype<eType ) co
14c30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14c40 69 66 28 20 28 65 53 61 6d 70 6c 65 74 79 70 65  if( (eSampletype
14c50 21 3d 65 54 79 70 65 29 20 29 20 62 72 65 61 6b  !=eType) ) break
14c60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14c70 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
14c80 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d 3e 65      if( pColl->e
14c90 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
14ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
14cb0 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20   nSample;.      
14cc0 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d 70 6c      char *zSampl
14cd0 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 74  e = sqlite3Utf8t
14ce0 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20 20 20  o16(.           
14cf0 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e 65 6e     db, pColl->en
14d00 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  c, aSample[i].u.
14d10 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42  z, aSample[i].nB
14d20 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a 20 20  yte, &nSample.  
14d30 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
14d40 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d 70 6c       if( !zSampl
14d50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14d60 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
14d70 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
14d80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14d90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14db0 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d 3e 78      r = pColl->x
14dc0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
14dd0 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61 6d 70  , nSample, zSamp
14de0 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  le, n, z);.     
14df0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
14e00 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65 29 3b  ee(db, zSample);
14e10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
14e20 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
14e30 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 70 43            r = pC
14e40 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
14e50 3e 70 55 73 65 72 2c 20 61 53 61 6d 70 6c 65 5b  >pUser, aSample[
14e60 69 5d 2e 6e 42 79 74 65 2c 20 61 53 61 6d 70 6c  i].nByte, aSampl
14e70 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c 20 7a 29 3b  e[i].u.z, n, z);
14e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e90 20 20 20 69 66 28 20 72 3e 30 20 29 20 62 72 65     if( r>0 ) bre
14ea0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14eb0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  }..    assert( i
14ec0 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c 49 54 45  >=0 && i<=SQLITE
14ed0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
14ee0 3b 0a 20 20 20 20 2a 70 69 52 65 67 69 6f 6e 20  ;.    *piRegion 
14ef0 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
14f00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
14f10 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 66 64 65  endif   /* #ifde
14f20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14f30 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT2 */../*.** 
14f40 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
14f50 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
14f60 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
14f70 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
14f80 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
14f90 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
14fa0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
14fb0 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
14fc0 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
14fd0 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
14fe0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
14ff0 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
15000 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
15010 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
15020 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
15030 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
15040 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
15050 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
15060 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
15070 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
15080 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
15090 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
150a0 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
150b0 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
150c0 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
150d0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
150e0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
150f0 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
15100 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
15110 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
15120 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
15130 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
15140 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
15150 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
15160 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
15170 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
15180 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
15190 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
151a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
151b0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
151c0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
151d0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
151e0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
151f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15200 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT2.static int 
15210 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
15220 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15230 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
15240 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
15250 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
15260 0a 29 7b 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  .){.  /* The eva
15270 6c 43 6f 6e 73 74 45 78 70 72 28 29 20 66 75 6e  lConstExpr() fun
15280 63 74 69 6f 6e 20 77 69 6c 6c 20 68 61 76 65 20  ction will have 
15290 61 6c 72 65 61 64 79 20 63 6f 6e 76 65 72 74 65  already converte
152a0 64 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c  d any TK_VARIABL
152b0 45 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  E.  ** expressio
152c0 6e 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 61 6e  n involved in an
152d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 74 6f   comparison into
152e0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20   a TK_REGISTER. 
152f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
15300 70 72 2d 3e 6f 70 21 3d 54 4b 5f 56 41 52 49 41  pr->op!=TK_VARIA
15310 42 4c 45 20 29 3b 0a 20 20 69 66 28 20 70 45 78  BLE );.  if( pEx
15320 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
15330 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
15340 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  2==TK_VARIABLE )
15350 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d  {.    int iVar =
15360 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
15370 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15380 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
15390 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b  e->pVdbe, iVar);
153a0 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37   /* IMP: R-23257
153b0 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a 70  -02778 */.    *p
153c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
153d0 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e  etValue(pParse->
153e0 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72  pReprepare, iVar
153f0 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75  , aff);.    retu
15400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15410 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
15420 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
15430 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
15440 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  r, SQLITE_UTF8, 
15450 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64  aff, pp);.}.#end
15460 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
15470 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
15480 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
15490 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
154a0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
154b0 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
154c0 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
154d0 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
154e0 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
154f0 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
15500 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
15510 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
15520 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
15530 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
15540 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
15550 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
15560 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
15570 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
15580 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
15590 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
155a0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
155b0 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
155c0 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
155d0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
155e0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
155f0 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
15600 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
15610 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
15640 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15650 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
15660 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
15670 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
15680 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
15690 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
156a0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
156b0 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
156c0 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
156d0 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
156e0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  rm..**.** The nE
156f0 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  q parameter is p
15700 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20  assed the index 
15710 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  of the index col
15720 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74  umn subject to t
15730 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73  he.** range cons
15740 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69  traint. Or, equi
15750 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75  valently, the nu
15760 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79  mber of equality
15770 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
15780 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65  optimized by the
15790 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20   proposed index 
157a0 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c  scan. For exampl
157b0 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65  e, assuming inde
157c0 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28  x p is.** on t1(
157d0 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53  a, b), and the S
157e0 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  QL query is:.**.
157f0 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
15800 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44   WHERE a = ? AND
15810 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f   b > ? AND b < ?
15820 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
15830 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
15840 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31  ssed the value 1
15850 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72   (as the range r
15860 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e  estricted column
15870 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73  ,.** b, is the s
15880 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20  econd left-most 
15890 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
158a0 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  dex). Or, if the
158b0 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
158c0 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
158d0 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61  HERE a > ? AND a
158e0 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
158f0 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62  hen nEq should b
15900 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
15910 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
15920 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67  alue is an integ
15930 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  er between 1 and
15940 20 31 30 30 2c 20 69 6e 63 6c 75 73 69 76 65 2e   100, inclusive.
15950 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c   A return.** val
15960 75 65 20 6f 66 20 31 20 69 6e 64 69 63 61 74 65  ue of 1 indicate
15970 73 20 74 68 61 74 20 74 68 65 20 70 72 6f 70 6f  s that the propo
15980 73 65 64 20 72 61 6e 67 65 20 73 63 61 6e 20 69  sed range scan i
15990 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
159a0 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78 69 6d 61  sit.** approxima
159b0 74 65 6c 79 20 31 2f 31 30 30 74 68 20 28 31 25  tely 1/100th (1%
159c0 29 20 6f 66 20 74 68 65 20 72 6f 77 73 20 73 65  ) of the rows se
159d0 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 6e 45  lected by the nE
159e0 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  q equality.** co
159f0 6e 73 74 72 61 69 6e 74 73 20 28 69 66 20 61 6e  nstraints (if an
15a00 79 29 2e 20 41 20 72 65 74 75 72 6e 20 76 61 6c  y). A return val
15a10 75 65 20 6f 66 20 31 30 30 20 69 6e 64 69 63 61  ue of 100 indica
15a20 74 65 73 20 74 68 61 74 20 69 74 20 69 73 20 65  tes that it is e
15a30 78 70 65 63 74 65 64 0a 2a 2a 20 74 68 61 74 20  xpected.** that 
15a40 74 68 65 20 72 61 6e 67 65 20 73 63 61 6e 20 77  the range scan w
15a50 69 6c 6c 20 76 69 73 69 74 20 65 76 65 72 79 20  ill visit every 
15a60 72 6f 77 20 28 31 30 30 25 29 20 73 65 6c 65 63  row (100%) selec
15a70 74 65 64 20 62 79 20 74 68 65 20 65 71 75 61 6c  ted by the equal
15a80 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
15a90 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ts..**.** In the
15aa0 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69   absence of sqli
15ab0 74 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45  te_stat2 ANALYZE
15ac0 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67   data, each rang
15ad0 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20  e inequality.** 
15ae0 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72  reduces the sear
15af0 63 68 20 73 70 61 63 65 20 62 79 20 32 2f 33 72  ch space by 2/3r
15b00 64 73 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e  ds.  Hence a sin
15b10 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  gle constraint (
15b20 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20  x>?).** results 
15b30 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 33  in a return of 3
15b40 33 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f  3 and a range co
15b50 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e  nstraint (x>? AN
15b60 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a  D x<?) results.*
15b70 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  * in a return of
15b80 20 31 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   11..*/.static i
15b90 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
15ba0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
15bb0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15bc0 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
15bd0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15be0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c00 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
15c10 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f  ing the range-co
15c20 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22  mpared column; "
15c30 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  x" */.  int nEq,
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c50 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43  index into p->aC
15c60 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67  ol[] of the rang
15c70 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
15c80 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
15c90 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
15ca0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
15cb0 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
15cc0 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
15cd0 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
15ce0 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
15cf0 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
15d00 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
15d10 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
15d20 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ULL */.  int *pi
15d30 45 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Est           /*
15d40 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 76 61 6c   OUT: Return val
15d50 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
15d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15d70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15d80 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20 69 66  ABLE_STAT2..  if
15d90 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 61  ( nEq==0 && p->a
15da0 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
15db0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 6f  lite3_value *pLo
15dc0 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  werVal = 0;.    
15dd0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15de0 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20  UpperVal = 0;.  
15df0 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20 20 20    int iEst;.    
15e00 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  int iLower = 0;.
15e10 20 20 20 20 69 6e 74 20 69 55 70 70 65 72 20 3d      int iUpper =
15e20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
15e30 4d 50 4c 45 53 3b 0a 20 20 20 20 75 38 20 61 66  MPLES;.    u8 af
15e40 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
15e50 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
15e60 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20  0]].affinity;.. 
15e70 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
15e80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15e90 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78  pr = pLower->pEx
15ea0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
15eb0 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
15ec0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
15ed0 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65 72  pr, aff, &pLower
15ee0 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
15ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15f00 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
15f10 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
15f20 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
15f30 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
15f40 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
15f50 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
15f60 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56 61  , aff, &pUpperVa
15f70 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l);.    }..    i
15f80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15f90 20 7c 7c 20 28 70 4c 6f 77 65 72 56 61 6c 3d 3d   || (pLowerVal==
15fa0 30 20 26 26 20 70 55 70 70 65 72 56 61 6c 3d 3d  0 && pUpperVal==
15fb0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
15fc0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f  te3ValueFree(pLo
15fd0 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 73  werVal);.      s
15fe0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
15ff0 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20  pUpperVal);.    
16000 20 20 67 6f 74 6f 20 72 61 6e 67 65 5f 65 73 74    goto range_est
16010 5f 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  _fallback;.    }
16020 65 6c 73 65 20 69 66 28 20 70 4c 6f 77 65 72 56  else if( pLowerV
16030 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
16040 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65  c = whereRangeRe
16050 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  gion(pParse, p, 
16060 70 55 70 70 65 72 56 61 6c 2c 20 26 69 55 70 70  pUpperVal, &iUpp
16070 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
16080 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
16090 20 69 55 70 70 65 72 2f 32 3b 0a 20 20 20 20 7d   iUpper/2;.    }
160a0 65 6c 73 65 20 69 66 28 20 70 55 70 70 65 72 56  else if( pUpperV
160b0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
160c0 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65  c = whereRangeRe
160d0 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  gion(pParse, p, 
160e0 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69 4c 6f 77  pLowerVal, &iLow
160f0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
16100 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
16110 20 28 69 4c 6f 77 65 72 20 2b 20 53 51 4c 49 54   (iLower + SQLIT
16120 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
16130 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d 65 6c 73  + 1)/2;.    }els
16140 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  e{.      rc = wh
16150 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
16160 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72  Parse, p, pUpper
16170 56 61 6c 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  Val, &iUpper);. 
16180 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
161a0 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
161b0 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
161c0 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 26 69  p, pLowerVal, &i
161d0 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Lower);.      }.
161e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 45 73 74 20      }..    iEst 
161f0 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
16200 72 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  r;.    testcase(
16210 20 69 45 73 74 3d 3d 53 51 4c 49 54 45 5f 49 4e   iEst==SQLITE_IN
16220 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
16230 20 20 20 61 73 73 65 72 74 28 20 69 45 73 74 3c     assert( iEst<
16240 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  =SQLITE_INDEX_SA
16250 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 69 66 28  MPLES );.    if(
16260 20 69 45 73 74 3c 31 20 29 7b 0a 20 20 20 20 20   iEst<1 ){.     
16270 20 69 45 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d   iEst = 1;.    }
16280 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ..    sqlite3Val
16290 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c  ueFree(pLowerVal
162a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
162b0 6c 75 65 46 72 65 65 28 70 55 70 70 65 72 56 61  lueFree(pUpperVa
162c0 6c 29 3b 0a 20 20 20 20 2a 70 69 45 73 74 20 3d  l);.    *piEst =
162d0 20 28 69 45 73 74 20 2a 20 31 30 30 29 2f 53 51   (iEst * 100)/SQ
162e0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
162f0 45 53 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ES;.    return r
16300 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f 65 73 74  c;.  }.range_est
16310 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65 6c 73 65  _fallback:.#else
16320 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16330 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
16340 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16350 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
16360 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e  AMETER(nEq);.#en
16370 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c  dif.  assert( pL
16380 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29  ower || pUpper )
16390 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26  ;.  if( pLower &
163a0 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
163b0 2a 70 69 45 73 74 20 3d 20 31 31 3b 0a 20 20 7d  *piEst = 11;.  }
163c0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 45 73 74  else{.    *piEst
163d0 20 3d 20 33 33 3b 0a 20 20 7d 0a 20 20 72 65 74   = 33;.  }.  ret
163e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
163f0 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65 72 79  * Find the query
16400 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73   plan for access
16410 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
16420 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74   table.  Write t
16430 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
16440 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
16450 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
16460 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
16470 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  plied as the.** 
16480 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  last parameter..
16490 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
164a0 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e   cost plan wins.
164b0 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
164c0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
164d0 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
164e0 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
164f0 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
16500 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
16510 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 6c   the selected pl
16520 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  an..** Factors t
16530 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
16540 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
16550 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
16560 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
16570 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
16580 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
16590 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
165a0 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
165b0 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
165c0 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
165d0 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
165e0 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
165f0 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
16600 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
16610 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
16620 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
16630 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
16640 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
16650 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
16660 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ED BY clause (pS
16670 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61  rc->pIndex) atta
16680 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  ched to the tabl
16690 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  e in.** the SQL 
166a0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
166b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  this function on
166c0 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61  ly considers pla
166d0 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ns using the .**
166e0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66   named index. If
166f0 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73   no such plan is
16700 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
16710 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
16720 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
16730 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69  DBL. If a plan i
16740 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65  s found that use
16750 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  s the named inde
16760 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  x, .** then the 
16770 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74  cost is calculat
16780 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20  ed in the usual 
16790 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  way..**.** If a 
167a0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
167b0 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  se (pSrc->notInd
167c0 65 78 65 64 21 3d 30 29 20 77 61 73 20 61 74 74  exed!=0) was att
167d0 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
167e0 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45  le .** in the SE
167f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
16800 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20  then no indexes 
16810 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20  are considered. 
16820 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a  However, the .**
16830 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d   selected plan m
16840 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64  ay still take ad
16850 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 74  vantage of the t
16860 61 62 6c 65 73 20 62 75 69 6c 74 2d 69 6e 20 72  ables built-in r
16870 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  owid.** index..*
16880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
16890 73 74 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20  stBtreeIndex(.  
168a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
168c0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
168d0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
168e0 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
168f0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
16900 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
16910 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
16920 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
16930 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
16940 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
16950 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
16960 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
16970 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
16980 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
16990 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lable */.  ExprL
169a0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
169b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
169c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
169d0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
169e0 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
169f0 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
16a00 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20  ery plan */.){. 
16a10 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
16a20 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
16a30 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
16a40 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
16a50 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
16a60 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
16a70 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
16a80 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
16a90 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
16aa0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
16ab0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
16ac0 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
16ad0 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
16ae0 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
16af0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
16b00 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
16b10 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
16b20 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
16b30 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
16b40 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
16b50 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
16b60 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
16b70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
16b80 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
16b90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
16ba0 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
16bb0 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
16bc0 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  key */.  unsigne
16bd0 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74 50 6b  d int aiRowEstPk
16be0 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f  [2]; /* The aiRo
16bf0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
16c00 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
16c10 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
16c20 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
16c30 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
16c40 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
16c50 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
16c60 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
16c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
16c80 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43  owed flags in pC
16c90 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
16ca0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
16cb0 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f  lize the cost to
16cc0 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61   a worst-case va
16cd0 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  lue */.  memset(
16ce0 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pCost, 0, sizeof
16cf0 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f  (*pCost));.  pCo
16d00 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49  st->rCost = SQLI
16d10 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
16d20 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
16d30 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
16d40 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
16d50 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
16d60 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
16d70 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
16d80 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
16d90 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
16da0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
16db0 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
16dc0 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
16dd0 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
16de0 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
16df0 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
16e00 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
16e10 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
16e20 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
16e30 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
16e40 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
16e50 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20   pSrc->jointype 
16e60 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
16e70 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
16e80 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
16e90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71  }else{.    idxEq
16ea0 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
16eb0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
16ec0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72  ;.  }..  if( pSr
16ed0 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
16ee0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
16ef0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
16f00 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
16f10 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
16f20 20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62      pIdx = pProb
16f30 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
16f40 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
16f50 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
16f60 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
16f70 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
16f80 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
16f90 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b  rmMask;.  }else{
16fa0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
16fb0 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
16fc0 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
16fd0 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
16fe0 63 74 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 70  ct to.    ** rep
16ff0 72 65 73 65 6e 74 20 74 68 65 20 70 72 69 6d 61  resent the prima
17000 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 49 6e  ry key */.    In
17010 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
17020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17030 6e 79 20 6f 74 68 65 72 20 69 6e 64 65 78 20 6f  ny other index o
17040 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
17050 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20     memset(&sPk, 
17060 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  0, sizeof(Index)
17070 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75  );.    sPk.nColu
17080 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  mn = 1;.    sPk.
17090 61 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f  aiColumn = &aiCo
170a0 6c 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  lumnPk;.    sPk.
170b0 61 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77  aiRowEst = aiRow
170c0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
170d0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
170e0 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
170f0 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
17100 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
17110 5b 30 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  [0] = pSrc->pTab
17120 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61  ->nRowEst;.    a
17130 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31  iRowEstPk[1] = 1
17140 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20 70  ;.    pFirst = p
17150 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
17160 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  x;.    if( pSrc-
17170 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  >notIndexed==0 )
17180 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  {.      sPk.pNex
17190 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
171a0 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
171b0 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d  sPk;.    wsFlagM
171c0 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20  ask = ~(.       
171d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
171e0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
171f0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
17200 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LL|WHERE_COLUMN_
17210 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20  RANGE.    );.   
17220 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
17230 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70  _EQ|WO_IN;.    p
17240 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Idx = 0;.  }..  
17250 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
17260 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67   indices looking
17270 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e   for the best on
17280 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
17290 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49  for(; pProbe; pI
172a0 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  dx=pProbe=pProbe
172b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f  ->pNext){.    co
172c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  nst unsigned int
172d0 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73   * const aiRowEs
172e0 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
172f0 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65  wEst;.    double
17300 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
17310 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
17320 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
17330 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  .    double nRow
17340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17350 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
17360 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
17370 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
17380 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20    int rev;      
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
173a0 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e   True to scan in
173b0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
173c0 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67  /.    int wsFlag
173d0 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61  s = 0;.    Bitma
173e0 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  sk used = 0;..  
173f0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
17400 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ng variables are
17410 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64   populated based
17420 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72 74 69   on the properti
17430 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73 63 61  es of.    ** sca
17440 6e 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  n being evaluate
17450 64 2e 20 54 68 65 79 20 61 72 65 20 74 68 65 6e  d. They are then
17460 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
17470 6e 65 20 74 68 65 20 65 78 70 65 63 74 65 64 0a  ne the expected.
17480 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e 64 20      ** cost and 
17490 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
174a0 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a 2a 0a  eturned..    **.
174b0 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a 20 20      **  nEq: .  
174c0 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72 20 6f    **    Number o
174d0 66 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  f equality terms
174e0 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6d 70   that can be imp
174f0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74  lemented using t
17500 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
17510 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a  .    **  nInMul:
17520 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65    .    **    The
17530 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22   "in-multiplier"
17540 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 73 74  . This is an est
17550 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e  imate of how man
17560 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  y seek operation
17570 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c  s .    **    SQL
17580 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d  ite must perform
17590 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e   on the index in
175a0 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65   question. For e
175b0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
175c0 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45 20      **    WHERE 
175d0 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20 2a  clause is:.    *
175e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  *.    **      WH
175f0 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c 20  ERE a IN (1, 2, 
17600 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c 20  3) AND b IN (4, 
17610 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20  5, 6).    **.   
17620 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
17630 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f  st perform 9 loo
17640 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  kups on an index
17650 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e   on (a, b), so n
17660 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a  InMul is .    **
17670 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47 69      set to 9. Gi
17680 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68  ven the same sch
17690 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20 6f  ema and either o
176a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
176b0 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20 20  WHERE .    **   
176c0 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a   clauses:.    **
176d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45  .    **      WHE
176e0 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a  RE a =  1.    **
176f0 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3e 3d        WHERE a >=
17700 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   2.    **.    **
17710 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65      nInMul is se
17720 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20  t to 1..    **. 
17730 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65 72     **    If ther
17740 65 20 65 78 69 73 74 73 20 61 20 57 48 45 52 45  e exists a WHERE
17750 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
17760 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  m "x IN (SELECT 
17770 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20 20  ...)", then .   
17780 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d 73   **    the sub-s
17790 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65 64  elect is assumed
177a0 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72 6f   to return 25 ro
177b0 77 73 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  ws for the purpo
177c0 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20  ses of .    **  
177d0 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49    determining nI
177e0 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nMul..    **.   
177f0 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a 20   **  bInEst:  . 
17800 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f 20     **    Set to 
17810 74 72 75 65 20 69 66 20 74 68 65 72 65 20 77 61  true if there wa
17820 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 22  s at least one "
17830 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
17840 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20 20  )" term used .  
17850 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65 72    **    in deter
17860 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  mining the value
17870 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20   of nInMul..    
17880 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 73 74 42 6f  **.    **  estBo
17890 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41  und:.    **    A
178a0 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68  n estimate on th
178b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
178c0 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74 20  table that must 
178d0 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41 0a  be searched.  A.
178e0 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65 20      **    value 
178f0 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68 65  of 100 means the
17900 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69 73   entire table is
17910 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e 67   searched.  Rang
17920 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
17930 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72 65    **    might re
17940 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20 76  duce this to a v
17950 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 31  alue less than 1
17960 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  00 to indicate t
17970 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  hat only.    ** 
17980 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f 66     a fraction of
17990 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 73   the table needs
179a0 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e 20   searching.  In 
179b0 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a 20  the absence of. 
179c0 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f     **    sqlite_
179d0 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61  stat2 ANALYZE da
179e0 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
179f0 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
17a00 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
17a10 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
17a20 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  3rd its original
17a30 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e   size.  So an x>
17a40 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  ? constraint red
17a50 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20 65  uces.    **    e
17a60 73 74 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20  stBound to 33.  
17a70 54 77 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  Two constraints 
17a80 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
17a90 64 75 63 65 20 65 73 74 42 6f 75 6e 64 20 74 6f  duce estBound to
17aa0 20 31 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   11..    **.    
17ab0 2a 2a 20 20 62 53 6f 72 74 3a 20 20 20 0a 20 20  **  bSort:   .  
17ac0 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e    **    Boolean.
17ad0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
17ae0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17af0 61 75 73 65 20 74 68 61 74 20 77 69 6c 6c 20 72  ause that will r
17b00 65 71 75 69 72 65 20 61 6e 20 0a 20 20 20 20 2a  equire an .    *
17b10 2a 20 20 20 20 65 78 74 65 72 6e 61 6c 20 73 6f  *    external so
17b20 72 74 20 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e  rt (i.e. scannin
17b30 67 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  g the index bein
17b40 67 20 65 76 61 6c 75 61 74 65 64 20 77 69 6c 6c  g evaluated will
17b50 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 20 20 20   not .    **    
17b60 63 6f 72 72 65 63 74 6c 79 20 6f 72 64 65 72 20  correctly order 
17b70 72 65 63 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a  records)..    **
17b80 0a 20 20 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70  .    **  bLookup
17b90 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f  : .    **    Boo
17ba0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 66 6f  lean. True if fo
17bb0 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74  r each index ent
17bc0 72 79 20 76 69 73 69 74 65 64 20 61 20 6c 6f 6f  ry visited a loo
17bd0 6b 75 70 20 6f 6e 20 74 68 65 20 0a 20 20 20 20  kup on the .    
17be0 2a 2a 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64  **    correspond
17bf0 69 6e 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ing table b-tree
17c00 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
17c10 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  is is always fal
17c20 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 66 6f  se .    **    fo
17c30 72 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65  r the rowid inde
17c40 78 2e 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64  x. For other ind
17c50 65 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65  exes, it is true
17c60 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20   unless all the 
17c70 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 6c 75 6d  .    **    colum
17c80 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
17c90 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  used by the SELE
17ca0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  CT statement are
17cb0 20 70 72 65 73 65 6e 74 20 69 6e 20 0a 20 20 20   present in .   
17cc0 20 2a 2a 20 20 20 20 74 68 65 20 69 6e 64 65 78   **    the index
17cd0 20 28 73 75 63 68 20 61 6e 20 69 6e 64 65 78 20   (such an index 
17ce0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73  is sometimes des
17cf0 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65  cribed as a cove
17d00 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20  ring index)..   
17d10 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70   **    For examp
17d20 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e  le, given the in
17d30 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
17d40 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65  he second of the
17d50 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
17d60 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65  **    two querie
17d70 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65  s requires table
17d80 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 2c   b-tree lookups,
17d90 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20 64   but the first d
17da0 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a  oes not..    **.
17db0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
17dc0 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20     SELECT a, b  
17dd0 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45    FROM tbl WHERE
17de0 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20   a = 1;.    **  
17df0 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
17e00 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
17e10 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
17e20 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
17e30 45 71 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 45  Eq;.    int bInE
17e40 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  st = 0;.    int 
17e50 6e 49 6e 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20  nInMul = 1;.    
17e60 69 6e 74 20 65 73 74 42 6f 75 6e 64 20 3d 20 31  int estBound = 1
17e70 30 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75  00;.    int nBou
17e80 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nd = 0;         
17e90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17ea0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17eb0 74 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69  ts seen */.    i
17ec0 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20  nt bSort = 0;.  
17ed0 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20    int bLookup = 
17ee0 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
17ef0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
17f00 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
17f10 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
17f20 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20   clause */..    
17f30 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
17f40 20 76 61 6c 75 65 73 20 6f 66 20 6e 45 71 20 61   values of nEq a
17f50 6e 64 20 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20  nd nInMul */.   
17f60 20 66 6f 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c   for(nEq=0; nEq<
17f70 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
17f80 20 6e 45 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69   nEq++){.      i
17f90 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
17fa0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
17fb0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
17fc0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
17fd0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54  j, notReady, eqT
17fe0 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a  ermMask, pIdx);.
17ff0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
18000 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
18010 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48    wsFlags |= (WH
18020 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
18030 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20  ERE_ROWID_EQ);. 
18040 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
18050 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
18060 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  N ){.        Exp
18070 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
18080 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
18090 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
180a0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
180b0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
180c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
180d0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
180e0 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
180f0 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
18100 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
18110 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
18120 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
18130 2e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  .pList) ){.     
18140 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70       nInMul *= p
18150 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
18160 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20  Expr + 1;.      
18170 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
18180 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
18190 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
181a0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
181b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
181c0 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
181d0 7d 0a 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20  }.      used |= 
181e0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
181f0 68 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ht;.    }..    /
18200 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
18210 76 61 6c 75 65 20 6f 66 20 65 73 74 42 6f 75 6e  value of estBoun
18220 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45  d. */.    if( nE
18230 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  q<pProbe->nColum
18240 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  n ){.      int j
18250 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
18260 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20  umn[nEq];.      
18270 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
18280 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
18290 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
182a0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49  |WO_GT|WO_GE, pI
182b0 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 57  dx) ){.        W
182c0 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
182d0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
182e0 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
182f0 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
18300 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 57 68  Idx);.        Wh
18310 65 72 65 54 65 72 6d 20 2a 70 42 74 6d 20 3d 20  ereTerm *pBtm = 
18320 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
18330 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
18340 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 49   WO_GT|WO_GE, pI
18350 64 78 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  dx);.        whe
18360 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
18370 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20 6e  Parse, pProbe, n
18380 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20  Eq, pBtm, pTop, 
18390 26 65 73 74 42 6f 75 6e 64 29 3b 0a 20 20 20 20  &estBound);.    
183a0 20 20 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a      if( pTop ){.
183b0 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64            nBound
183c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
183d0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
183e0 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
183f0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
18400 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  op->prereqRight;
18410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18420 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20     if( pBtm ){. 
18430 20 20 20 20 20 20 20 20 20 6e 42 6f 75 6e 64 2b           nBound+
18440 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46  +;.          wsF
18450 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
18460 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
18470 20 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d     used |= pBtm-
18480 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
18490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
184a0 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
184b0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
184c0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
184d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
184e0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
184f0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
18500 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  e ){.      testc
18510 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
18520 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
18530 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18540 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
18550 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b  E_COLUMN_NULL );
18560 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c  .      if( (wsFl
18570 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
18580 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
18590 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b  UMN_NULL))==0 ){
185a0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
185b0 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
185c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
185e0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
185f0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69  clause and the i
18600 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69  ndex being consi
18610 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a  dered will.    *
18620 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e  * naturally scan
18630 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
18640 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74  uired order, set
18650 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
18660 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e   flags.    ** in
18670 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
18680 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
18690 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
186a0 75 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65  use but the inde
186b0 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63  x.    ** will sc
186c0 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
186d0 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
186e0 74 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69  t the bSort vari
186f0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
18700 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
18710 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
18720 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
18730 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
18740 5f 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20  _NULL))==0.     
18750 20 20 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49     && isSortingI
18760 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d  ndex(pParse,pWC-
18770 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65  >pMaskSet,pProbe
18780 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e  ,iCur,pOrderBy,n
18790 45 71 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29  Eq,&rev).      )
187a0 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
187b0 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
187c0 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
187d0 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
187e0 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20  ORDERBY;.       
187f0 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76   wsFlags |= (rev
18800 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   ? WHERE_REVERSE
18810 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 0);.      }el
18820 73 65 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72  se{.        bSor
18830 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
18840 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
18850 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c  currently calcul
18860 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f  ating the cost o
18870 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
18880 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20   (not the IPK.  
18890 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74    ** index), det
188a0 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65  ermine if all re
188b0 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61  quired column da
188c0 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ta may be obtain
188d0 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20  ed without .    
188e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69  ** using the mai
188f0 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66  n table (i.e. if
18900 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20   the index is a 
18910 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20  covering.    ** 
18920 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71  index for this q
18930 75 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c  uery). If it is,
18940 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49   set the WHERE_I
18950 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a  DX_ONLY flag in.
18960 20 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20      ** wsFlags. 
18970 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 74  Otherwise, set t
18980 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61  he bLookup varia
18990 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f  ble to true.  */
189a0 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
189b0 20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20   wsFlags ){.    
189c0 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
189d0 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
189e0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
189f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
18a00 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
18a10 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
18a20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
18a30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
18a40 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
18a50 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
18a60 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
18a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18a80 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
18a90 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
18aa0 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
18ab0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
18ac0 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
18ad0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
18ae0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18af0 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
18b00 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  number of rows o
18b10 66 20 6f 75 74 70 75 74 2e 20 20 46 6f 72 20 61  f output.  For a
18b20 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 0a 20  n IN operator,. 
18b30 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6c 65 74     ** do not let
18b40 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 65 78   the estimate ex
18b50 63 65 65 64 20 68 61 6c 66 20 74 68 65 20 72 6f  ceed half the ro
18b60 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
18b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  .    */.    nRow
18b80 20 3d 20 28 64 6f 75 62 6c 65 29 28 61 69 52 6f   = (double)(aiRo
18b90 77 45 73 74 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d  wEst[nEq] * nInM
18ba0 75 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  ul);.    if( bIn
18bb0 45 73 74 20 26 26 20 6e 52 6f 77 2a 32 3e 61 69  Est && nRow*2>ai
18bc0 52 6f 77 45 73 74 5b 30 5d 20 29 7b 0a 20 20 20  RowEst[0] ){.   
18bd0 20 20 20 6e 52 6f 77 20 3d 20 61 69 52 6f 77 45     nRow = aiRowE
18be0 73 74 5b 30 5d 2f 32 3b 0a 20 20 20 20 20 20 6e  st[0]/2;.      n
18bf0 49 6e 4d 75 6c 20 3d 20 28 69 6e 74 29 28 6e 52  InMul = (int)(nR
18c00 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45  ow / aiRowEst[nE
18c10 71 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  q]);.    }..    
18c20 2f 2a 20 41 73 73 75 6d 65 20 63 6f 6e 73 74 61  /* Assume consta
18c30 6e 74 20 63 6f 73 74 20 74 6f 20 61 63 63 65 73  nt cost to acces
18c40 73 20 61 20 72 6f 77 20 61 6e 64 20 6c 6f 67 61  s a row and loga
18c50 72 69 74 68 6d 69 63 20 63 6f 73 74 20 74 6f 0a  rithmic cost to.
18c60 20 20 20 20 2a 2a 20 64 6f 20 61 20 62 69 6e 61      ** do a bina
18c70 72 79 20 73 65 61 72 63 68 2e 20 20 48 65 6e 63  ry search.  Henc
18c80 65 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63  e, the initial c
18c90 6f 73 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ost is the numbe
18ca0 72 20 6f 66 20 6f 75 74 70 75 74 0a 20 20 20 20  r of output.    
18cb0 2a 2a 20 72 6f 77 73 20 70 6c 75 73 20 6c 6f 67  ** rows plus log
18cc0 32 28 74 61 62 6c 65 2d 73 69 7a 65 29 20 74 69  2(table-size) ti
18cd0 6d 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mes the number o
18ce0 66 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 65  f binary searche
18cf0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f  s..    */.    co
18d00 73 74 20 3d 20 6e 52 6f 77 20 2b 20 6e 49 6e 4d  st = nRow + nInM
18d10 75 6c 2a 65 73 74 4c 6f 67 28 61 69 52 6f 77 45  ul*estLog(aiRowE
18d20 73 74 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  st[0]);..    /* 
18d30 41 64 6a 75 73 74 20 74 68 65 20 6e 75 6d 62 65  Adjust the numbe
18d40 72 20 6f 66 20 72 6f 77 73 20 61 6e 64 20 74 68  r of rows and th
18d50 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20  e cost downward 
18d60 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77 73 0a  to reflect rows.
18d70 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
18d80 65 78 63 6c 75 64 65 64 20 62 79 20 72 61 6e 67  excluded by rang
18d90 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  e constraints.. 
18da0 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d     */.    nRow =
18db0 20 28 6e 52 6f 77 20 2a 20 28 64 6f 75 62 6c 65   (nRow * (double
18dc0 29 65 73 74 42 6f 75 6e 64 29 20 2f 20 28 64 6f  )estBound) / (do
18dd0 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 63 6f  uble)100;.    co
18de0 73 74 20 3d 20 28 63 6f 73 74 20 2a 20 28 64 6f  st = (cost * (do
18df0 75 62 6c 65 29 65 73 74 42 6f 75 6e 64 29 20 2f  uble)estBound) /
18e00 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 0a 20   (double)100;.. 
18e10 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65     /* Add in the
18e20 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   estimated cost 
18e30 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72  of sorting the r
18e40 65 73 75 6c 74 0a 20 20 20 20 2a 2f 0a 20 20 20  esult.    */.   
18e50 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20   if( bSort ){.  
18e60 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
18e70 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
18e80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
18e90 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
18ea0 63 61 6e 20 62 65 20 74 61 6b 65 6e 20 64 69 72  can be taken dir
18eb0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 69  ectly from the i
18ec0 6e 64 65 78 2c 20 77 65 20 61 76 6f 69 64 0a 20  ndex, we avoid. 
18ed0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c     ** doing tabl
18ee0 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 69 73  e lookups.  This
18ef0 20 72 65 64 75 63 65 73 20 74 68 65 20 63 6f 73   reduces the cos
18f00 74 20 62 79 20 68 61 6c 66 2e 20 20 28 4e 6f 74  t by half.  (Not
18f10 20 72 65 61 6c 6c 79 20 2d 0a 20 20 20 20 2a 2a   really -.    **
18f20 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   this needs to b
18f30 65 20 66 69 78 65 64 2e 29 0a 20 20 20 20 2a 2f  e fixed.).    */
18f40 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
18f50 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20 29 7b 0a 20   bLookup==0 ){. 
18f60 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 28 64 6f       cost /= (do
18f70 75 62 6c 65 29 32 3b 0a 20 20 20 20 7d 0a 20 20  uble)2;.    }.  
18f80 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
18f90 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
18fa0 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
18fb0 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
18fc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
18fd0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  e additional con
18fe0 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73  straints on this
18ff0 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e   table that cann
19000 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65  ot.    ** be use
19010 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
19020 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68  nt index, but wh
19030 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20  ich might lower 
19040 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  the number.    *
19050 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
19060 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f  , adjust the nRo
19070 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e  w value accordin
19080 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  gly.  This only 
19090 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20  .    ** matters 
190a0 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  if the current i
190b0 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65 61 73  ndex is the leas
190c0 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20  t costly, so do 
190d0 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a  not bother.    *
190e0 2a 20 77 69 74 68 20 74 68 69 73 20 73 74 65 70  * with this step
190f0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b   if we already k
19100 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20 77  now this index w
19110 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65  ill not be chose
19120 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  n..    ** Also, 
19130 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
19140 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
19150 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20  t below 2 using 
19160 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a  this step..    *
19170 2a 0a 20 20 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  *.    ** Do not 
19180 72 65 64 75 63 65 20 74 68 65 20 6f 75 74 70 75  reduce the outpu
19190 74 20 72 6f 77 20 63 6f 75 6e 74 20 69 66 20 70  t row count if p
191a0 53 72 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  Src is the only 
191b0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  table that.    *
191c0 2a 20 69 73 20 6e 6f 74 52 65 61 64 79 3b 20 69  * is notReady; i
191d0 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20 61 20  f notReady is a 
191e0 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
191f0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
19200 63 61 73 65 0a 20 20 20 20 2a 2a 20 77 68 65 6e  case.    ** when
19210 20 74 68 65 20 6d 61 69 6e 20 73 71 6c 69 74 65   the main sqlite
19220 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6c 6f  3WhereBegin() lo
19230 6f 70 20 69 73 20 73 63 61 6e 6e 69 6e 67 20 66  op is scanning f
19240 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 0a  or a table with.
19250 20 20 20 20 2a 2a 20 61 6e 64 20 22 6f 70 74 69      ** and "opti
19260 6d 61 6c 22 20 69 6e 64 65 78 2c 20 61 6e 64 20  mal" index, and 
19270 6f 6e 20 73 75 63 68 20 61 20 73 63 61 6e 20 74  on such a scan t
19280 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
19290 75 6e 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 63  unt.    ** reduc
192a0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  tion is not vali
192b0 64 20 62 65 63 61 75 73 65 20 69 74 20 64 6f 65  d because it doe
192c0 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
192d0 20 22 70 43 6f 73 74 2d 3e 75 73 65 64 22 0a 20   "pCost->used". 
192e0 20 20 20 2a 2a 20 62 69 74 6d 61 70 2e 20 20 54     ** bitmap.  T
192f0 68 65 20 6e 6f 74 52 65 61 64 79 20 62 69 74 6d  he notReady bitm
19300 61 70 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20  ap will also be 
19310 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 77  a power of two w
19320 68 65 6e 20 77 65 0a 20 20 20 20 2a 2a 20 61 72  hen we.    ** ar
19330 65 20 73 63 61 6e 6e 69 6e 67 20 66 6f 72 20 74  e scanning for t
19340 68 65 20 6c 61 73 74 20 74 61 62 6c 65 20 69 6e  he last table in
19350 20 61 20 36 34 2d 77 61 79 20 6a 6f 69 6e 2e 20   a 64-way join. 
19360 20 57 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 0a   We are willing.
19370 20 20 20 20 2a 2a 20 74 6f 20 62 79 70 61 73 73      ** to bypass
19380 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
19390 6f 6e 20 69 6e 20 74 68 61 74 20 63 6f 72 6e 65  on in that corne
193a0 72 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  r case..    */. 
193b0 20 20 20 69 66 28 20 6e 52 6f 77 3e 32 20 26 26     if( nRow>2 &&
193c0 20 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43   cost<=pCost->rC
193d0 6f 73 74 20 26 26 20 28 6e 6f 74 52 65 61 64 79  ost && (notReady
193e0 20 26 20 28 6e 6f 74 52 65 61 64 79 2d 31 29 29   & (notReady-1))
193f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
19400 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
19410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
19420 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
19430 20 20 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d     int nSkipEq =
19440 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20   nEq;           
19450 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
19460 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73  constraints to s
19470 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  kip */.      int
19480 20 6e 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42   nSkipRange = nB
19490 6f 75 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ound;     /* Num
194a0 62 65 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61  ber of < constra
194b0 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  ints to skip */.
194c0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68        Bitmask th
194d0 69 73 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  isTab;          
194e0 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72     /* Bitmap for
194f0 20 70 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20   pSrc */..      
19500 74 68 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73  thisTab = getMas
19510 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
19520 20 69 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f   iCur);.      fo
19530 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
19540 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52  k=pWC->nTerm; nR
19550 6f 77 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20  ow>2 && k; k--, 
19560 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
19570 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
19580 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19590 55 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UAL ) continue;.
195a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
195b0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
195c0 6e 6f 74 52 65 61 64 79 29 21 3d 74 68 69 73 54  notReady)!=thisT
195d0 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
195e0 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
195f0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
19600 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
19610 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
19620 20 20 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29     if( nSkipEq )
19630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
19640 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
19650 74 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d  t nEq equality m
19660 61 74 63 68 65 73 20 73 69 6e 63 65 20 74 68 65  atches since the
19670 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
19680 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
19690 79 20 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20  y accounted for 
196a0 74 68 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  these */.       
196b0 20 20 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a       nSkipEq--;.
196c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
196d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
196e0 41 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69  Assume each addi
196f0 74 69 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20  tional equality 
19700 6d 61 74 63 68 20 72 65 64 75 63 65 73 20 74 68  match reduces th
19710 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
19720 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65       ** set size
19730 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
19740 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  10 */.          
19750 20 20 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20    nRow /= 10;.  
19760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19770 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
19780 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
19790 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
197a0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
197b0 20 20 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52        if( nSkipR
197c0 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
197d0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
197e0 65 20 66 69 72 73 74 20 6e 42 6f 75 6e 64 20 72  e first nBound r
197f0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
19800 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
19810 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
19820 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
19830 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
19840 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
19850 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20  SkipRange--;.   
19860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
19880 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f  ume each additio
19890 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  nal range constr
198a0 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65  aint reduces the
198b0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
198c0 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20      ** set size 
198d0 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  by a factor of 3
198e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
198f0 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20  nRow /= 3;.     
19900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19920 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  /* Any other exp
19930 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74  ression lowers t
19940 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
19950 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20  unt by half */. 
19960 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d           nRow /=
19970 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
19980 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19990 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20  nRow<2 ) nRow = 
199a0 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57  2;.    }...    W
199b0 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20 20  HERETRACE((.    
199c0 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25    "%s(%s): nEq=%
199d0 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74 42  d nInMul=%d estB
199e0 6f 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64  ound=%d bSort=%d
199f0 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c   bLookup=%d wsFl
19a00 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20  ags=0x%x\n".    
19a10 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52    "         notR
19a20 65 61 64 79 3d 30 78 25 6c 6c 78 20 6e 52 6f 77  eady=0x%llx nRow
19a30 3d 25 2e 32 66 20 63 6f 73 74 3d 25 2e 32 66 20  =%.2f cost=%.2f 
19a40 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a  used=0x%llx\n",.
19a50 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62        pSrc->pTab
19a60 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f  ->zName, (pIdx ?
19a70 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
19a80 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45  ipk"), .      nE
19a90 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42 6f  q, nInMul, estBo
19aa0 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f  und, bSort, bLoo
19ab0 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20  kup, wsFlags,.  
19ac0 20 20 20 20 6e 6f 74 52 65 61 64 79 2c 20 6e 52      notReady, nR
19ad0 6f 77 2c 20 63 6f 73 74 2c 20 75 73 65 64 0a 20  ow, cost, used. 
19ae0 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49     ));..    /* I
19af0 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
19b00 74 68 65 20 62 65 73 74 20 77 65 20 68 61 76 65  the best we have
19b10 20 73 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68   seen so far, th
19b20 65 6e 20 72 65 63 6f 72 64 20 74 68 69 73 0a 20  en record this. 
19b30 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20     ** index and 
19b40 69 74 73 20 63 6f 73 74 20 69 6e 20 74 68 65 20  its cost in the 
19b50 70 43 6f 73 74 20 73 74 72 75 63 74 75 72 65 2e  pCost structure.
19b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19b70 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c 61 67  (!pIdx || wsFlag
19b80 73 29 0a 20 20 20 20 20 26 26 20 28 63 6f 73 74  s).     && (cost
19b90 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 7c 7c  <pCost->rCost ||
19ba0 20 28 63 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72   (cost<=pCost->r
19bb0 43 6f 73 74 20 26 26 20 6e 52 6f 77 3c 70 43 6f  Cost && nRow<pCo
19bc0 73 74 2d 3e 6e 52 6f 77 29 29 0a 20 20 20 20 29  st->nRow)).    )
19bd0 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  {.      pCost->r
19be0 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
19bf0 20 20 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d     pCost->nRow =
19c00 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f   nRow;.      pCo
19c10 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b  st->used = used;
19c20 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
19c30 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28 77 73  an.wsFlags = (ws
19c40 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61 73 6b  Flags&wsFlagMask
19c50 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
19c60 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a  plan.nEq = nEq;.
19c70 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
19c80 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
19c90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19ca0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
19cb0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
19cc0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
19cd0 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
19ce0 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
19cf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
19d00 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b  ->pIndex ) break
19d10 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20  ;..    /* Reset 
19d20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65  masks for the ne
19d30 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  xt index in the 
19d40 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c  loop */.    wsFl
19d50 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45  agMask = ~(WHERE
19d60 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
19d70 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20  ROWID_RANGE);.  
19d80 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69    eqTermMask = i
19d90 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  dxEqTermMask;.  
19da0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
19db0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
19dc0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 53  clause and the S
19dd0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
19de0 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20  er flag.  ** is 
19df0 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73  set, then revers
19e00 65 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74  e the order that
19e10 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
19e20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20  be scanned.  ** 
19e30 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  in. This is used
19e40 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   for application
19e50 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c   testing, to hel
19e60 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a  p find cases.  *
19e70 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63 61 74  * where applicat
19e80 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65  ion behaviour de
19e90 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e  pends on the (un
19ea0 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74  defined) order t
19eb0 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hat.  ** SQLite 
19ec0 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20  outputs rows in 
19ed0 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  in the absence o
19ee0 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  f an ORDER BY cl
19ef0 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ause.  */.  if( 
19f00 21 70 4f 72 64 65 72 42 79 20 26 26 20 70 50 61  !pOrderBy && pPa
19f10 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
19f20 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
19f30 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43 6f 73  rder ){.    pCos
19f40 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
19f50 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
19f60 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
19f70 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 43   pOrderBy || (pC
19f80 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
19f90 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
19fa0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19fb0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
19fc0 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74  Idx==0 || (pCost
19fd0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
19fe0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d  HERE_ROWID_EQ)==
19ff0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a000 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  Src->pIndex==0 .
1a010 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d         || pCost-
1a020 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
1a030 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74  .       || pCost
1a040 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70  ->plan.u.pIdx==p
1a050 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29  Src->pIndex .  )
1a060 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
1a070 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a  ("best index is:
1a080 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70   %s\n", .    ((p
1a090 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1a0a0 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1a0b0 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e  ULLSCAN)==0 ? "n
1a0c0 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20 20 20  one" : .        
1a0d0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
1a0e0 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61  Idx ? pCost->pla
1a0f0 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  n.u.pIdx->zName 
1a100 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20  : "ipk").  ));. 
1a110 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65   .  bestOrClause
1a120 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1a130 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1a140 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f  y, pOrderBy, pCo
1a150 73 74 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d  st);.  bestAutom
1a160 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
1a170 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1a180 52 65 61 64 79 2c 20 70 43 6f 73 74 29 3b 0a 20  Ready, pCost);. 
1a190 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
1a1a0 6c 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61  lags |= eqTermMa
1a1b0 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  sk;.}../*.** Fin
1a1c0 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  d the query plan
1a1d0 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74   for accessing t
1a1e0 61 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e  able pSrc->pTab.
1a1f0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65   Write the.** be
1a200 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e  st query plan an
1a210 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20  d its cost into 
1a220 74 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62  the WhereCost ob
1a230 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a  ject supplied .*
1a240 2a 20 61 73 20 74 68 65 20 6c 61 73 74 20 70 61  * as the last pa
1a250 72 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75  rameter. This fu
1a260 6e 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75  nction may calcu
1a270 6c 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  late the cost of
1a280 0a 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e  .** both real an
1a290 64 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  d virtual table 
1a2a0 73 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  scans..*/.static
1a2b0 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28   void bestIndex(
1a2c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a2d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a2e0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1a2f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a300 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
1a310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1a320 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1a330 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a340 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
1a350 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1a360 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
1a370 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1a380 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
1a390 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
1a3a0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
1a3b0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
1a3c0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1a3d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1a3e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a3f0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
1a400 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
1a410 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
1a420 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
1a430 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1a440 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a450 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
1a460 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29  al(pSrc->pTab) )
1a470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
1a480 64 65 78 5f 69 6e 66 6f 20 2a 70 20 3d 20 30 3b  dex_info *p = 0;
1a490 0a 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c  .    bestVirtual
1a4a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1a4b0 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1a4c0 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f  y, pOrderBy, pCo
1a4d0 73 74 2c 20 26 70 29 3b 0a 20 20 20 20 69 66 28  st, &p);.    if(
1a4e0 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64   p->needToFreeId
1a4f0 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71  xStr ){.      sq
1a500 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64  lite3_free(p->id
1a510 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xStr);.    }.   
1a520 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1a530 50 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20  Parse->db, p);. 
1a540 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1a550 7b 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49  {.    bestBtreeI
1a560 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
1a570 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
1a580 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
1a590 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1a5a0 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
1a5b0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1a5c0 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
1a5d0 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
1a5e0 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
1a5f0 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
1a600 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
1a610 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
1a620 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
1a630 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1a640 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
1a650 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
1a660 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
1a670 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1a680 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
1a690 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
1a6a0 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1a6b0 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1a6c0 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
1a6d0 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
1a6e0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
1a6f0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
1a700 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
1a710 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
1a720 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
1a730 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
1a740 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
1a750 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
1a760 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
1a770 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
1a780 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
1a790 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
1a7a0 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
1a7b0 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
1a7c0 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
1a7d0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
1a7e0 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
1a7f0 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
1a800 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
1a810 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
1a820 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1a830 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35  OF: R-24597-5865
1a840 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64  5 No tests are d
1a850 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68  one for terms th
1a860 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65  at are.** comple
1a870 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62  tely satisfied b
1a880 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  y indices..**.**
1a890 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
1a8a0 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
1a8b0 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
1a8c0 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
1a8d0 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
1a8e0 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
1a8f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1a900 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
1a910 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1a920 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
1a930 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
1a940 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
1a950 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
1a960 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
1a970 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
1a980 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
1a990 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
1a9a0 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
1a9b0 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
1a9c0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1a9d0 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
1a9e0 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
1a9f0 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
1aa00 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
1aa10 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
1aa20 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
1aa30 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
1aa40 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
1aa50 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
1aa60 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
1aa70 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
1aa80 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
1aa90 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
1aaa0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
1aab0 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
1aac0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
1aad0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
1aae0 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
1aaf0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
1ab00 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1ab10 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
1ab20 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
1ab30 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
1ab40 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
1ab50 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
1ab60 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
1ab70 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
1ab80 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
1ab90 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
1aba0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
1abb0 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
1abc0 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
1abd0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
1abe0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
1abf0 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
1ac00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ac10 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
1ac20 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
1ac30 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
1ac40 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1ac50 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
1ac60 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1ac70 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
1ac80 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
1ac90 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
1aca0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
1acb0 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
1acc0 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
1acd0 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
1ace0 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
1acf0 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
1ad00 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
1ad10 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
1ad20 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
1ad30 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
1ad40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ad50 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
1ad60 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
1ad70 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
1ad80 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
1ad90 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
1ada0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
1adb0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
1adc0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
1add0 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
1ade0 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
1adf0 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
1ae00 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
1ae10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1ae20 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
1ae30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1ae40 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1ae50 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1ae60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
1ae70 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
1ae80 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
1ae90 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
1aea0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1aeb0 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
1aec0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
1aed0 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
1aee0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
1aef0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
1af00 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
1af10 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1af20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
1af30 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
1af40 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
1af50 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
1af60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1af70 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
1af80 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
1af90 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
1afa0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1afb0 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
1afc0 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
1afd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1afe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1aff0 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
1b000 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b010 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
1b020 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
1b030 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b040 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1b050 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
1b060 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
1b070 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1b080 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
1b090 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
1b0a0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
1b0b0 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
1b0c0 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
1b0d0 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
1b0e0 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
1b0f0 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
1b100 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
1b110 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
1b120 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
1b130 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
1b140 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
1b150 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
1b160 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
1b170 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
1b180 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
1b190 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
1b1a0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
1b1b0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1b1c0 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
1b1d0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
1b1e0 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
1b1f0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
1b200 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
1b210 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
1b220 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
1b230 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
1b240 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
1b250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1b260 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1b270 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b280 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1b290 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
1b2a0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1b2b0 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
1b2c0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1b2d0 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e  *pLevel, /* When
1b2e0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
1b2f0 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
1b300 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
1b310 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
1b320 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
1b330 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
1b340 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1b350 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
1b360 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1b370 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
1b380 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b390 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
1b3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b3b0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
1b3c0 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
1b3d0 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
1b3e0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
1b3f0 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
1b400 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1b410 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1b420 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
1b430 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
1b440 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
1b450 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
1b460 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
1b470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b480 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1b490 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
1b4a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1b4b0 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
1b4c0 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
1b4d0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
1b4e0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
1b4f0 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  In;..    assert(
1b500 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
1b510 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
1b520 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
1b530 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
1b540 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
1b550 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20   0);.    iTab = 
1b560 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
1b570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b580 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1b590 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73  iTab, 0);.    as
1b5a0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
1b5b0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1b5c0 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20  RE_IN_ABLE );.  
1b5d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
1b5e0 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
1b5f0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
1b600 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1b610 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b620 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1b630 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
1b640 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
1b650 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
1b660 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1b670 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1b680 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1b690 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
1b6c0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
1b6d0 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
1b6e0 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
1b6f0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
1b700 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
1b710 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
1b720 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
1b730 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
1b740 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
1b750 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1b760 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1b770 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
1b780 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
1b790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b7a0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
1b7b0 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
1b7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b7d0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
1b7e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b7f0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1b800 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
1b810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1b820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1b830 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
1b840 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
1b850 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
1b860 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
1b870 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
1b880 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1b890 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
1b8a0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
1b8b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b8c0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1b8d0 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
1b8e0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
1b8f0 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  r an.** index..*
1b900 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1b910 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
1b920 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
1b930 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
1b940 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
1b950 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
1b960 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
1b970 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
1b980 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
1b990 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
1b9a0 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
1b9b0 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
1b9c0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
1b9d0 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
1b9e0 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
1b9f0 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
1ba00 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
1ba10 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
1ba20 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
1ba30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1ba40 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
1ba50 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
1ba60 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
1ba70 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
1ba80 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
1ba90 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
1baa0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
1bab0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
1bac0 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
1bad0 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
1bae0 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
1baf0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
1bb00 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
1bb10 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
1bb20 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
1bb30 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
1bb40 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
1bb50 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
1bb60 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
1bb70 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
1bb80 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
1bb90 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
1bba0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
1bbb0 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
1bbc0 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
1bbd0 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
1bbe0 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
1bbf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
1bc00 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
1bc10 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
1bc20 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75  ry cell and retu
1bc30 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
1bc40 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
1bc50 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74  cell. The code t
1bc60 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
1bc70 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
1bc80 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  se that memory c
1bc90 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ell to store the
1bca0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
1bcb0 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
1bcc0 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
1bcd0 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
1bce0 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
1bcf0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1bd00 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
1bd10 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
1bd20 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
1bd30 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
1bd40 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
1bd50 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73  rning, *pzAff is
1bd60 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1bd70 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1bd80 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  ning a.** copy o
1bd90 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  f the column aff
1bda0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20  inity string of 
1bdb0 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61  the index alloca
1bdc0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
1bdd0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
1bde0 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20  Except, entries 
1bdf0 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  in the copy of t
1be00 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  he string associ
1be10 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75  ated.** with equ
1be20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1be30 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20  s that use NONE 
1be40 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
1be50 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
1be60 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20  F_NONE. This is 
1be70 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
1be80 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
1be90 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
1bea0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1beb0 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
1bec0 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
1bed0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1bee0 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
1bef0 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
1bf00 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
1bf10 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
1bf20 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
1bf30 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
1bf40 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
1bf50 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
1bf60 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
1bf70 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
1bf80 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e  ) has NONE affin
1bf90 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65  ity,.** no conve
1bfa0 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  rsion should be 
1bfb0 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65  attempted before
1bfc0 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61   using a t2.b va
1bfd0 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  lue as part of.*
1bfe0 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63  * a key to searc
1bff0 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e  h the index. Hen
1c000 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ce the first byt
1c010 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
1c020 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  d affinity.** st
1c030 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61  ring in this exa
1c040 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65  mple would be se
1c050 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f  t to SQLITE_AFF_
1c060 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NONE..*/.static 
1c070 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
1c080 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
1c090 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c0a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1c0b0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
1c0c0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
1c0d0 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
1c0e0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
1c0f0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
1c100 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
1c110 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
1c120 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1c130 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1c140 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
1c150 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
1c160 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
1c170 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
1c180 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
1c190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c1a0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1c1b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1c1c0 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
1c1d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
1c1e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1c1f0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1c200 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  /.){.  int nEq =
1c210 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
1c220 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  q;   /* The numb
1c230 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
1c240 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
1c250 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
1c260 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
1c280 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1c290 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
1c2a0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1c2b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1c2c0 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
1c2d0 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
1c2e0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76   int iCur = pLev
1c2f0 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f  el->iTabCur;   /
1c300 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
1c310 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
1c320 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c340 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
1c350 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  int term */.  in
1c360 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
1c370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1c380 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1c390 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c3b0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
1c3c0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c3f0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1c400 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1c410 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  *zAff;          
1c420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
1c430 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72  nity string to r
1c440 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  eturn */..  /* T
1c450 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
1c460 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
1c470 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
1c480 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
1c490 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
1c4a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1c4b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b  WHERE_INDEXED );
1c4c0 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  .  pIdx = pLevel
1c4d0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a  ->plan.u.pIdx;..
1c4e0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1c4f0 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
1c500 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
1c510 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
1c520 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
1c530 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
1c540 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
1c550 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
1c560 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
1c570 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1c580 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
1c590 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1c5a0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
1c5b0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1c5c0 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
1c5d0 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
1c5e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
1c5f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1c600 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
1c610 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
1c620 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
1c630 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
1c640 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71  dx->nColumn>=nEq
1c650 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   );.  for(j=0; j
1c660 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
1c670 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20  int r1;.    int 
1c680 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
1c690 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d  mn[j];.    pTerm
1c6a0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1c6b0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
1c6c0 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  dy, pLevel->plan
1c6d0 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b  .wsFlags, pIdx);
1c6e0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
1c6f0 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b  Term==0) ) break
1c700 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1c710 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20  lowing true for 
1c720 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64  indices with red
1c730 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20  undant columns. 
1c740 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41  .    ** Ex: CREA
1c750 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1c760 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54  1(a,b,a); SELECT
1c770 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1c780 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f   a=0 AND b=0; */
1c790 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
1c7a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1c7b0 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20   TERM_CODED)!=0 
1c7c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c7d0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1c7e0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1c7f0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
1c800 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31  -11662 */.    r1
1c810 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1c820 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1c830 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61  m, pLevel, regBa
1c840 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
1c850 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
1c860 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
1c870 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1c880 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c890 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
1c8a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
1c8b0 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
1c8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c8d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c8e0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
1c8f0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
1c900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c910 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1c920 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1c930 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
1c940 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1c950 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1c960 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
1c970 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1c980 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
1c990 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
1c9a0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
1c9b0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1c9c0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1c9d0 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
1c9e0 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
1c9f0 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
1ca00 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
1ca10 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1ca20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ca30 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1ca40 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1ca50 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1ca60 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1ca70 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ca80 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ca90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1caa0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1cab0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1cac0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1cad0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1cae0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1caf0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1cb00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cb10 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1cb20 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1cb30 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a  n regBase;.}../*
1cb40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1cb50 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1cb60 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1cb70 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1cb80 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1cb90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1cba0 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1cbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1cbc0 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1cbd0 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1cbe0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1cbf0 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1cc00 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1cc10 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1cc20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1cc30 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1cc40 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1cc50 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1cc60 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ed */.  u16 wctr
1cc70 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20  lFlags,      /* 
1cc80 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
1cc90 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
1cca0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
1ccb0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1ccc0 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
1ccd0 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
1cce0 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
1ccf0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
1cd00 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
1cd10 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1cd20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
1cd30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cd40 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1cd50 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1cd60 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
1cd70 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
1cd80 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
1cd90 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1cda0 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
1cdb0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
1cdc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
1cdd0 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
1cde0 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
1cdf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ce00 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
1ce10 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
1ce20 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
1ce30 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1ce40 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
1ce50 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
1ce60 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
1ce70 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44  se *pWC;    /* D
1ce80 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
1ce90 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45  the entire WHERE
1cea0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
1ceb0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ced0 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  A WHERE clause t
1cee0 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  erm */.  Parse *
1cef0 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1cf00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cf20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
1cf50 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   stmt under cons
1cf60 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  tructions */.  s
1cf70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cf80 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
1cf90 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
1cfa0 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  rm being coded *
1cfb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b  /.  int addrBrk;
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1cfe0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
1cff0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
1d000 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20  nt addrCont;    
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d020 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
1d030 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
1d040 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
1d050 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20   iRowidReg = 0; 
1d060 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1d070 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69  is stored in thi
1d080 73 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e  s register, if n
1d090 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ot zero */.  int
1d0a0 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30   iReleaseReg = 0
1d0b0 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72  ;      /* Temp r
1d0c0 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
1d0d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1d0e0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1d0f0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
1d100 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
1d110 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49  dbe;.  pWC = pWI
1d120 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76  nfo->pWC;.  pLev
1d130 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
1d140 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49  iLevel];.  pTabI
1d150 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  tem = &pWInfo->p
1d160 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
1d170 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75  l->iFrom];.  iCu
1d180 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
1d190 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20  ursor;.  bRev = 
1d1a0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1d1b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45  Flags & WHERE_RE
1d1c0 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69  VERSE)!=0;.  omi
1d1d0 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c  tTable = (pLevel
1d1e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
1d1f0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1d200 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1d210 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
1d220 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
1d230 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72  LE)==0;..  /* Cr
1d240 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
1d250 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
1d260 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
1d270 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72  uctions.  ** for
1d280 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
1d290 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72  p.  Jump to addr
1d2a0 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  Brk to break out
1d2b0 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a   of a loop..  **
1d2c0 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
1d2d0 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
1d2e0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
1d2f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
1d300 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a  * loop..  **.  *
1d310 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20  * When there is 
1d320 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
1d330 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22  we also have a "
1d340 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74  addrNxt" label t
1d350 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74  hat.  ** means t
1d360 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1d370 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
1d380 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
1d390 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20  When.  ** there 
1d3a0 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74  are no IN operat
1d3b0 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  ors in the const
1d3c0 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64  raints, the "add
1d3d0 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a  rNxt" label.  **
1d3e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1d3f0 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a  "addrBrk"..  */.
1d400 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76    addrBrk = pLev
1d410 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c  el->addrBrk = pL
1d420 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20  evel->addrNxt = 
1d430 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1d440 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43  abel(v);.  addrC
1d450 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  ont = pLevel->ad
1d460 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
1d470 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1d480 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d490 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
1d4a0 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
1d4b0 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
1d4c0 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69  e and.  ** initi
1d4d0 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
1d4e0 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
1d4f0 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
1d500 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20  atches any.  ** 
1d510 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20  row of the left 
1d520 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
1d530 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  n..  */.  if( pL
1d540 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26  evel->iFrom>0 &&
1d550 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f   (pTabItem[0].jo
1d560 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
1d570 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76  )!=0 ){.    pLev
1d580 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
1d590 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1d5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d5b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1d5c0 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
1d5d0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
1d5e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d5f0 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
1d600 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
1d610 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1d620 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1d630 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28  ALTABLE.  if(  (
1d640 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
1d650 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d660 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d670 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20  .    /* Case 0: 
1d680 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   The table is a 
1d690 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20  virtual-table.  
1d6a0 55 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20  Use the VFilter 
1d6b0 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a  and VNext.    **
1d6c0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
1d6d0 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
1d6e0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65    */.    int iRe
1d6f0 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65  g;   /* P3 Value
1d700 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20   for OP_VFilter 
1d710 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1d720 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62  ndex_info *pVtab
1d730 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
1d740 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20  an.u.pVtabIdx;. 
1d750 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1d760 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e  nt = pVtabIdx->n
1d770 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20  Constraint;.    
1d780 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
1d790 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
1d7a0 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a  usage *aUsage =.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74  pVtabIdx->aConst
1d7f0 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20  raintUsage;.    
1d800 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
1d810 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1d820 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69  raint *aConstrai
1d830 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  nt =.           
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61       pVtabIdx->a
1d870 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20  Constraint;..   
1d880 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d890 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1d8a0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1d8b0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1d8c0 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  arse, nConstrain
1d8d0 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  t+2);.    for(j=
1d8e0 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e  1; j<=nConstrain
1d8f0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; j++){.      f
1d900 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74  or(k=0; k<nConst
1d910 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20  raint; k++){.   
1d920 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
1d930 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20  k].argvIndex==j 
1d940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1d950 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
1d960 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66  aint[k].iTermOff
1d970 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  set;.          s
1d980 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1d990 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54  Parse, pWC->a[iT
1d9a0 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67  erm].pExpr->pRig
1d9b0 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20  ht, iReg+j+1);. 
1d9c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1d9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e  }.      if( k==n
1d9f0 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65  Constraint ) bre
1da00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ak;.    }.    sq
1da10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1da20 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
1da30 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
1da40 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
1da50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1da60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31   OP_Integer, j-1
1da70 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73  , iReg+1);.    s
1da80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1da90 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
1daa0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69  iCur, addrBrk, i
1dab0 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  Reg, pVtabIdx->i
1dac0 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74               pVt
1dae0 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
1daf0 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52  eIdxStr ? P4_MPR
1db00 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
1db10 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d  );.    pVtabIdx-
1db20 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1db30 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  r = 0;.    for(j
1db40 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
1db50 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; j++){.      i
1db60 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69  f( aUsage[j].omi
1db70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
1db80 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
1db90 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
1dba0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73  set;.        dis
1dbb0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1dbc0 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29   &pWC->a[iTerm])
1dbd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dbe0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1dbf0 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70   OP_VNext;.    p
1dc00 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
1dc10 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
1dc20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1dc30 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1dc40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1dc50 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1dc60 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
1dc70 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  int+2);.    sqli
1dc80 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1dc90 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65  pParse, 1);.  }e
1dca0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1dcb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1dcc0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1dcd0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1dce0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
1dcf0 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a  WID_EQ ){.    /*
1dd00 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
1dd10 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
1dd20 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
1dd30 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1dd40 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
1dd50 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1dd60 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1dd70 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
1dd80 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
1dd90 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
1dda0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
1ddb0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
1ddc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
1ddd0 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
1dde0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1ddf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1de00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1de10 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
1de20 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
1de30 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
1de40 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
1de50 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1de60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1de70 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1de80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1de90 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1dea0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61  r==iCur );.    a
1deb0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1dec0 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
1ded0 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
1dee0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1def0 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  AL ); /* EV: R-3
1df00 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
1df10 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f    iRowidReg = co
1df20 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
1df30 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
1df40 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65  evel, iReleaseRe
1df50 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20  g);.    addrNxt 
1df60 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1df70 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1df80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
1df90 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64  ustBeInt, iRowid
1dfa0 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  Reg, addrNxt);. 
1dfb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dfc0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
1dfd0 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72  ists, iCur, addr
1dfe0 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Nxt, iRowidReg);
1dff0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e000 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
1e010 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f  e, iCur, -1, iRo
1e020 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62  widReg);.    Vdb
1e030 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1e040 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  "));.    pLevel-
1e050 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
1e060 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
1e070 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1e080 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
1e090 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  NGE ){.    /* Ca
1e0a0 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61  se 2:  We have a
1e0b0 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
1e0c0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
1e0d0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
1e0e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1e0f0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
1e100 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b  ;.    int start;
1e110 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56  .    int memEndV
1e120 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68  alue = 0;.    Wh
1e130 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
1e140 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73   *pEnd;..    ass
1e150 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1e160 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  0 );.    pStart 
1e170 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1e180 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
1e190 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
1e1a0 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20   0);.    pEnd = 
1e1b0 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
1e1c0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
1e1d0 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
1e1e0 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20  );.    if( bRev 
1e1f0 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ){.      pTerm =
1e200 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   pStart;.      p
1e210 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
1e220 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
1e230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e240 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
1e250 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
1e260 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1e270 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66  ression that def
1e280 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62  ines the start b
1e290 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ound */.      in
1e2a0 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20  t r1, rTemp;    
1e2b0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
1e2c0 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
1e2d0 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20   start boundary 
1e2e0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  */..      /* The
1e2f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1e300 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63  ant maps TK_xx c
1e310 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73  odes into corres
1e320 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  ponding .      *
1e330 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20  * seek opcodes. 
1e340 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61   It depends on a
1e350 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65   particular orde
1e360 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20  ring of TK_xx.  
1e370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
1e380 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20  st u8 aMoveOp[] 
1e390 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f  = {.           /
1e3a0 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53  * TK_GT */  OP_S
1e3b0 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20  eekGt,.         
1e3c0 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f    /* TK_LE */  O
1e3d0 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20  P_SeekLe,.      
1e3e0 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f       /* TK_LT */
1e3f0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20    OP_SeekLt,.   
1e400 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45          /* TK_GE
1e410 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20   */  OP_SeekGe. 
1e420 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73       };.      as
1e430 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f  sert( TK_LE==TK_
1e440 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+1 );      /* 
1e450 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  Make sure the or
1e460 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20  dering.. */.    
1e470 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
1e480 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20  =TK_GT+2 );     
1e490 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20   /*  ... of the 
1e4a0 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20  TK_xx values... 
1e4b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1e4c0 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20   TK_GE==TK_GT+3 
1e4d0 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20  );      /*  ... 
1e4e0 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a  is correcct. */.
1e4f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e500 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73   pStart->wtFlags
1e510 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e520 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37  ); /* EV: R-3057
1e530 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20  5-11662 */.     
1e540 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
1e550 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1e560 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1e570 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1e580 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
1e590 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ur );.      r1 =
1e5a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e5b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d  Temp(pParse, pX-
1e5c0 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29  >pRight, &rTemp)
1e5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e5e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f  dbeAddOp3(v, aMo
1e5f0 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47  veOp[pX->op-TK_G
1e600 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  T], iCur, addrBr
1e610 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  k, r1);.      Vd
1e620 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1e630 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  k"));.      sqli
1e640 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1e650 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1e660 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
1e670 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e680 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1e690 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73  Temp);.      dis
1e6a0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1e6b0 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65   pStart);.    }e
1e6c0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1e6d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e6e0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1e6f0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
1e700 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
1e710 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1e720 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1e730 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1e740 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1e750 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1e760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e770 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
1e780 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74  =iCur );.      t
1e790 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
1e7a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e7b0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
1e7c0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
1e7d0 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c  .      memEndVal
1e7e0 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ue = ++pParse->n
1e7f0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
1e800 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1e810 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d  e, pX->pRight, m
1e820 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20  emEndValue);.   
1e830 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54     if( pX->op==T
1e840 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LT || pX->op==
1e850 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20  TK_GT ){.       
1e860 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
1e870 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a   OP_Le : OP_Ge;.
1e880 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e890 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
1e8a0 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f  ev ? OP_Lt : OP_
1e8b0 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Gt;.      }.    
1e8c0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1e8d0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
1e8e0 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73   }.    start = s
1e8f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1e900 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c  tAddr(v);.    pL
1e910 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
1e920 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
1e930 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ext;.    pLevel-
1e940 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
1e950 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
1e960 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  rt;.    if( pSta
1e970 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30  rt==0 && pEnd==0
1e980 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
1e990 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1e9a0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1e9b0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
1e9c0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1e9d0 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
1e9e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e9f0 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1ea00 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1ea10 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1ea20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1ea30 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1ea40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ea50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1ea60 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
1ea70 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1ea80 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1ea90 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1eaa0 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1eab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eac0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
1ead0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
1eae0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
1eaf0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1eb00 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1eb10 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1eb20 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
1eb30 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
1eb40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
1eb50 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1eb60 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
1eb70 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
1eb80 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f  UMN_EQ) ){.    /
1eb90 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e  * Case 3: A scan
1eba0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e   using an index.
1ebb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ebc0 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45         The WHERE
1ebd0 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74   clause may cont
1ebe0 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ain zero or more
1ebf0 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a   equality .    *
1ec00 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20  *         terms 
1ec10 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70  ("==" or "IN" op
1ec20 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65  erators) that re
1ec30 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20  fer to the N.   
1ec40 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74   **         left
1ec50 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  -most columns of
1ec60 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d   the index. It m
1ec70 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a  ay also contain.
1ec80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
1ec90 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1eca0 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20  aints (>, <, >= 
1ecb0 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e  or <=) on the in
1ecc0 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dexed.    **    
1ecd0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
1ece0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1ecf0 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
1ed00 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
1ed10 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1ed20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
1ed30 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
1ed40 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
1ed50 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20  t must.    **   
1ed60 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d        use the "=
1ed70 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72  =" and "IN" oper
1ed80 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70  ators. For examp
1ed90 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20  le, if the .    
1eda0 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
1edb0 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
1edc0 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
1edd0 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
1ede0 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ll .    **      
1edf0 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20     optimized:.  
1ee00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ee10 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a         x=5.    *
1ee20 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1ee30 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a   AND y=10.    **
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1ee50 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1ee60 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1ee70 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
1ee80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1ee90 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e    x=5 AND y=5 AN
1eea0 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20  D z<=10.    **. 
1eeb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68     **         Th
1eec0 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74  e z<10 term of t
1eed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e  he following can
1eee0 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c  not be used, onl
1eef0 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  y.    **        
1ef00 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20   the x=5 term:. 
1ef10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ef20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1ef30 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20  z<10.    **.    
1ef40 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
1ef50 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
1ef60 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
1ef70 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
1ef80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20    **         If 
1ef90 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65  there are no ine
1efa0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1efb0 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61  nts, then N is a
1efc0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1efd0 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
1efe0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1eff0 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
1f000 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
1f010 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
1f020 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20   clause.    **  
1f030 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f040 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
1f050 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
1f060 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
1f070 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66   **         to f
1f080 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20  orce the output 
1f090 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d  order to conform
1f0a0 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e   to an ORDER BY.
1f0b0 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74  .    */  .    st
1f0c0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
1f0d0 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
1f0e0 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20     0,.      0,. 
1f0f0 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20       OP_Rewind, 
1f100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
1f110 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
1f120 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
1f130 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  &  !bRev) */.   
1f140 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20     OP_Last,     
1f150 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21          /* 3: (!
1f160 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1f170 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20  s && startEq && 
1f180 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20    bRev) */.     
1f190 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20   OP_SeekGt,     
1f1a0 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
1f1b0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
1f1c0 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
1f1d0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
1f1e0 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20  P_SeekLt,       
1f1f0 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
1f200 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
1f210 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
1f220 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f230 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20  SeekGe,         
1f240 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63    /* 6: (start_c
1f250 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
1f260 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76  startEq && !bRev
1f270 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f280 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  ekLe            
1f290 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
1f2a0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
1f2b0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
1f2c0 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74  */.    };.    st
1f2d0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
1f2e0 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndOp[] = {.     
1f2f0 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
1f300 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
1f310 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
1f320 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45  /.      OP_IdxGE
1f330 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f340 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
1f350 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
1f360 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20  .      OP_IdxLT 
1f370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1f380 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1f390 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20  ts && bRev) */. 
1f3a0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45     };.    int nE
1f3b0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
1f3c0 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  .nEq;  /* Number
1f3d0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1f3e0 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  ms */.    int is
1f3f0 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20  MinQuery = 0;   
1f400 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1f410 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
1f420 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e  d SELECT min(x).
1f430 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  . */.    int reg
1f440 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
1f450 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1f460 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
1f470 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
1f480 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20   */.    int r1; 
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
1f4b0 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65  ister */.    Whe
1f4c0 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74  reTerm *pRangeSt
1f4d0 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65  art = 0;  /* Ine
1f4e0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
1f4f0 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72  nt at range star
1f500 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  t */.    WhereTe
1f510 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20  rm *pRangeEnd = 
1f520 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c  0;    /* Inequal
1f530 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1f540 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20  t range end */. 
1f550 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20     int startEq; 
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65  /* True if range
1f580 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20   start uses ==, 
1f590 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20  >= or <= */.    
1f5a0 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20  int endEq;      
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5c0 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e  True if range en
1f5d0 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  d uses ==, >= or
1f5e0 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73   <= */.    int s
1f5f0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1f600 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
1f610 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e   of range is con
1f620 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20  strained */.    
1f630 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f650 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
1f660 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20  aint terms */.  
1f670 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f690 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77  * The index we w
1f6a0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a  ill be using */.
1f6b0 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b      int iIdxCur;
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
1f6e0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
1f6f0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78  x */.    int nEx
1f700 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20  traReg = 0;     
1f710 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f720 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
1f730 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  rs needed */.   
1f740 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f760 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63   Instruction opc
1f770 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ode */.    char 
1f780 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20  *zStartAff;     
1f790 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
1f7a0 69 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ity for start of
1f7b0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1f7c0 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  t */.    char *z
1f7d0 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20  EndAff;         
1f7e0 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1f7f0 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e  y for end of ran
1f800 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1f810 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65  ..    pIdx = pLe
1f820 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
1f830 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1f840 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1f850 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61  .    k = pIdx->a
1f860 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20  iColumn[nEq];   
1f870 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20    /* Column for 
1f880 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f890 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f  raints */..    /
1f8a0 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
1f8b0 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
1f8c0 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
1f8d0 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
1f8e0 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
1f8f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f900 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
1f910 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
1f920 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
1f930 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
1f940 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
1f950 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
1f960 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
1f970 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
1f980 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
1f990 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
1f9a0 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
1f9b0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1f9c0 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
1f9d0 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
1f9e0 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
1f9f0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
1fa00 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
1fa10 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1fa20 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
1fa30 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
1fa40 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
1fa50 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
1fa60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1fa70 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
1fa80 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
1fa90 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c  .     && (pLevel
1faa0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57  ->plan.wsFlags&W
1fab0 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20  HERE_ORDERBY).  
1fac0 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f     && (pIdx->nCo
1fad0 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b  lumn>nEq).    ){
1fae0 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
1faf0 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
1fb00 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20  r==1 ); */.     
1fb10 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64   /* assert( pOrd
1fb20 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
1fb30 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
1fb40 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29  >aiColumn[nEq] )
1fb50 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e  ; */.      isMin
1fb60 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20  Query = 1;.     
1fb70 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a   nExtraReg = 1;.
1fb80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
1fb90 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74  nd any inequalit
1fba0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  y constraint ter
1fbb0 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  ms for the start
1fbc0 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a   and end .    **
1fbd0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a   of the range. .
1fbe0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1fbf0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1fc00 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1fc10 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
1fc20 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54  RangeEnd = findT
1fc30 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
1fc40 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
1fc50 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29  LT|WO_LE), pIdx)
1fc60 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1fc70 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
1fc80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1fc90 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
1fca0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
1fcb0 20 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74       pRangeStart
1fcc0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1fcd0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
1fce0 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  dy, (WO_GT|WO_GE
1fcf0 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
1fd00 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1fd10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
1fd20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1fd30 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74  aluate all const
1fd40 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e  raint terms usin
1fd50 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a  g == or IN.    *
1fd60 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
1fd70 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
1fd80 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61  terms in an arra
1fd90 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  y of registers. 
1fda0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1fdb0 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a  t regBase..    *
1fdc0 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  /.    regBase = 
1fdd0 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
1fde0 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50  erms(.        pP
1fdf0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57  arse, pLevel, pW
1fe00 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78  C, notReady, nEx
1fe10 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41  traReg, &zStartA
1fe20 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45  ff.    );.    zE
1fe30 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44  ndAff = sqlite3D
1fe40 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
1fe50 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  db, zStartAff);.
1fe60 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c      addrNxt = pL
1fe70 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a  evel->addrNxt;..
1fe80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1fe90 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65   doing a reverse
1fea0 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
1feb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
1fec0 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66  x, or.    ** a f
1fed0 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61  orward order sca
1fee0 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  n on a descendin
1fef0 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68  g index, interch
1ff00 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  ange the .    **
1ff10 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
1ff20 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
1ff30 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
1ff40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ff50 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75   nEq<pIdx->nColu
1ff60 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
1ff70 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
1ff80 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
1ff90 43 29 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50  C) ){.      SWAP
1ffa0 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
1ffb0 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
1ffc0 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tart);.    }..  
1ffd0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1ffe0 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
1fff0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
20000 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
20010 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
20020 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
20030 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
20040 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
20050 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20060 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64  End && pRangeEnd
20070 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20080 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
20090 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
200a0 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
200b0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
200c0 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20  ;.    startEq = 
200d0 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20  !pRangeStart || 
200e0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
200f0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
20100 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45  WO_GE);.    endE
20110 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64  q =   !pRangeEnd
20120 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   || pRangeEnd->e
20130 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
20140 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74  E|WO_GE);.    st
20150 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
20160 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
20170 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20   nEq>0;..    /* 
20180 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63  Seek the index c
20190 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61  ursor to the sta
201a0 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  rt of the range.
201b0 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61   */.    nConstra
201c0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69  int = nEq;.    i
201d0 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29  f( pRangeStart )
201e0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
201f0 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61  ight = pRangeSta
20200 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
20210 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
20220 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
20230 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
20240 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c  +nEq);.      sql
20250 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
20260 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
20270 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
20280 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 69  ddrNxt);.      i
20290 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
202a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
202b0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
202c0 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
202d0 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
202e0 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
202f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
20300 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
20310 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
20320 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
20330 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
20340 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
20350 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
20360 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
20370 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
20380 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
20390 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
203a0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
203b0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
203c0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
203d0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
203e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
203f0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
20400 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
20410 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
20420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
20430 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
20440 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
20450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20460 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
20470 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
20480 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20490 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
204a0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
204b0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
204c0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c  11662 */.    }el
204d0 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
204e0 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
204f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20500 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
20510 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
20520 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
20530 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
20540 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
20550 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
20560 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
20570 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
20580 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
20590 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
205a0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
205b0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
205c0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
205d0 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
205e0 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
205f0 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
20600 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20610 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
20620 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
20630 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
20640 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
20650 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
20660 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
20670 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
20680 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
20690 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
206a0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
206b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
206c0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
206d0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
206e0 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
206f0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
20700 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
20710 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
20720 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
20730 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
20740 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
20750 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
20760 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
20770 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
20780 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
20790 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
207a0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
207b0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
207c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
207d0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
207e0 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
207f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20800 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20810 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
20820 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nEq);.      sqli
20830 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c  te3ExprCodeIsNul
20840 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c  lJump(v, pRight,
20850 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64   regBase+nEq, ad
20860 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 69 66  drNxt);.      if
20870 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
20880 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20890 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
208a0 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
208b0 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
208c0 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
208d0 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
208e0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
208f0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
20900 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
20910 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
20920 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
20930 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
20940 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
20950 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
20960 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
20970 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
20980 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
20990 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
209a0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
209b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
209c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
209d0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
209e0 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
209f0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
20a00 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
20a10 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20a20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20a30 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
20a40 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
20a50 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
20a60 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
20a70 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
20a80 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
20a90 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
20aa0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
20ab0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
20ac0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
20ad0 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  62 */.    }.    
20ae0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
20af0 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74  arse->db, zStart
20b00 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
20b10 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20b20 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20  db, zEndAff);.. 
20b30 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
20b40 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
20b50 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
20b60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
20b70 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
20b80 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
20b90 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
20ba0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
20bb0 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
20bc0 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52   op = aEndOp[(pR
20bd0 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20  angeEnd || nEq) 
20be0 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20  * (1 + bRev)];. 
20bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20c00 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20  =OP_Noop );.    
20c10 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
20c20 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65  _IdxGE );.    te
20c30 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
20c40 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20  dxLT );.    if( 
20c50 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
20c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20c70 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
20c80 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
20c90 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
20ca0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
20cb0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
20cc0 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
20cd0 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
20ce0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
20cf0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
20d00 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
20d10 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
20d20 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
20d30 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
20d40 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
20d50 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
20d60 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
20d70 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
20d80 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
20d90 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
20da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
20db0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
20dc0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
20dd0 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
20de0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
20df0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
20e00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20e10 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
20e20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
20e30 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  OP_LIMIT );.    
20e40 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
20e50 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
20e60 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
20e70 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
20e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20e90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
20ea0 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e  lumn, iIdxCur, n
20eb0 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  Eq, r1);.      s
20ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20ed0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
20ee0 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  1, addrCont);.  
20ef0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
20f00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
20f10 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
20f20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62 6c  /* Seek the tabl
20f30 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65 71  e cursor, if req
20f40 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69 73  uired */.    dis
20f50 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
20f60 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
20f70 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
20f80 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64  Level, pRangeEnd
20f90 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69 74  );.    if( !omit
20fa0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
20fb0 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
20fc0 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
20fd0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
20fe0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
20ff0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21000 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
21010 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21030 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
21040 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
21050 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
21060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21070 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69  p2(v, OP_Seek, i
21080 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29 3b  Cur, iRowidReg);
21090 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
210a0 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  ek */.    }..   
210b0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
210c0 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
210d0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
210e0 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a   loop. Disable .
210f0 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
21100 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
21110 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
21120 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
21130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65  ..    */.    pLe
21140 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
21150 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
21160 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
21170 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
21180 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
21190 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
211a0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
211b0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
211c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
211d0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
211e0 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
211f0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
21200 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
21210 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
21220 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
21230 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21240 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
21250 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
21260 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
21270 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
21280 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
21290 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
212a0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
212b0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
212c0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
212d0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
212e0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
212f0 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
21300 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
21310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
21320 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
21330 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
21340 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
21350 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
21360 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
21370 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
21380 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
21390 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
213a0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
213b0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
213c0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
213d0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
213e0 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
213f0 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
21400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
21410 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
21420 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
21430 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
21440 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
21450 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
21460 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
21470 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
21480 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
21490 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
214a0 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
214b0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
214c0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
214d0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
214e0 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
214f0 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
21500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
21510 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
21520 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
21530 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
21540 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
21550 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
21560 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
21570 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
21580 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
21590 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
215a0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
215b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
215c0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
215d0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
215e0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
215f0 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
21600 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
21610 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
21620 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
21630 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
21640 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
21650 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21660 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21680 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
21690 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
216a0 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
216b0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
216c0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
216d0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
216e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
216f0 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
21720 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
21730 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
21740 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
21750 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
21760 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
21770 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
21780 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
21790 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
217a0 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
217b0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
217c0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
217d0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
217e0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
217f0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
21800 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 2f 2a   *pFinal;     /*
21810 20 46 69 6e 61 6c 20 73 75 62 74 65 72 6d 20 77   Final subterm w
21820 69 74 68 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61  ithin the OR-cla
21830 75 73 65 2e 20 2a 2f 0a 20 20 20 20 53 72 63 4c  use. */.    SrcL
21840 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20  ist *pOrTab;    
21850 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20     /* Shortened 
21860 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52  table list or OR
21870 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69  -clause generati
21880 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72  on */..    int r
21890 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
218a0 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20  rse->nMem;      
218b0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
218c0 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f   used with OP_Go
218d0 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  sub */.    int r
218e0 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20  egRowset = 0;   
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
21910 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65   for RowSet obje
21920 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ct */.    int re
21930 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  gRowid = 0;     
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
21960 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f  holding rowid */
21970 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f  .    int iLoopBo
21980 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dy = sqlite3Vdbe
21990 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
219a0 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20  * Start of loop 
219b0 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  body */.    int 
219c0 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20  iRetInit;       
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
219f0 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e   of regReturn in
21a00 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e  it */.    int un
21a10 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b  testedTerms = 0;
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a30 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63  Some terms not c
21a40 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64  ompletely tested
21a50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
21a60 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20     .    pTerm = 
21a70 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
21a80 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Term;.    assert
21a90 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
21aa0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
21ab0 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f  >eOperator==WO_O
21ac0 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
21ad0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
21ae0 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21   & TERM_ORINFO)!
21af0 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20  =0 );.    pOrWc 
21b00 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
21b10 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69  nfo->wc;.    pFi
21b20 6e 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  nal = &pOrWc->a[
21b30 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b  pOrWc->nTerm-1];
21b40 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
21b50 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20  = OP_Return;.   
21b60 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65   pLevel->p1 = re
21b70 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a  gReturn;..    /*
21b80 20 53 65 74 20 75 70 20 61 20 6e 65 77 20 53 72   Set up a new Sr
21b90 63 4c 69 73 74 20 6e 69 20 70 4f 72 54 61 62 20  cList ni pOrTab 
21ba0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
21bb0 61 62 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e  able being scann
21bc0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
21bd0 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 61 5b  s loop in the a[
21be0 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61 6c 6c 20  0] slot and all 
21bf0 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20  notReady tables 
21c00 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e  in a[1..] slots.
21c10 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 65 63  .    ** This bec
21c20 6f 6d 65 73 20 74 68 65 20 53 72 63 4c 69 73 74  omes the SrcList
21c30 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
21c40 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
21c50 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20  3WhereBegin().. 
21c60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57     */.    if( pW
21c70 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29  Info->nLevel>1 )
21c80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f 74  {.      int nNot
21c90 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
21ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
21cb0 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65 61 64 79  mber of notReady
21cc0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
21cd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21ce0 69 74 65 6d 20 2a 6f 72 69 67 53 72 63 3b 20 20  item *origSrc;  
21cf0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
21d00 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
21d10 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65 61 64 79  .      nNotReady
21d20 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   = pWInfo->nLeve
21d30 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20 31 3b 0a  l - iLevel - 1;.
21d40 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 73        pOrTab = s
21d50 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
21d60 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Raw(pParse->db,.
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
21d90 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e 6f  of(*pOrTab)+ nNo
21da0 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70 4f  tReady*sizeof(pO
21db0 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  rTab->a[0]));.  
21dc0 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d 3d      if( pOrTab==
21dd0 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52 65  0 ) return notRe
21de0 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54 61  ady;.      pOrTa
21df0 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 69 31 36  b->nAlloc = (i16
21e00 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
21e10 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
21e20 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
21e30 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
21e40 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
21e50 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
21e60 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
21e70 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
21e80 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
21e90 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
21ea0 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
21eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
21ec0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
21ed0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
21ee0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
21ef0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
21f00 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
21f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
21f20 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
21f30 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
21f40 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
21f50 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
21f60 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
21f70 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
21f80 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
21f90 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
21fa0 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20 20  mpty rowset..   
21fb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 20   **.    ** Also 
21fc0 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52 65  initialize regRe
21fd0 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20  turn to contain 
21fe0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
21ff0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  he instruction .
22000 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
22010 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
22020 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74 68   OP_Return at th
22030 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
22040 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20 2a  loop. This.    *
22050 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  * is required in
22060 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20 4c   a few obscure L
22070 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20 77  EFT JOIN cases w
22080 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d  here control jum
22090 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  ps.    ** over t
220a0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
220b0 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  op into the body
220c0 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73 20   of it. In this 
220d0 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  case the .    **
220e0 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e 73   correct respons
220f0 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f 66  e for the end-of
22100 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65 20  -loop code (the 
22110 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74 6f  OP_Return) is to
22120 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74 68   .    ** fall th
22130 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
22140 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 6a  t instruction, j
22150 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65 78  ust as an OP_Nex
22160 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a 2a  t does if.    **
22170 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75 6e   called on an un
22180 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72 73  initialized curs
22190 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
221a0 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
221b0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
221c0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
221d0 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b    regRowset = ++
221e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
221f0 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
22200 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22220 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
22230 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
22240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65 74  ;.    }.    iRet
22250 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
22260 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
22270 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65  nteger, 0, regRe
22280 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 28  turn);..    for(
22290 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
222a0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
222b0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
222c0 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
222d0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
222e0 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
222f0 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70  ursor==iCur || p
22300 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
22310 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
22320 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
22330 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
22340 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
22350 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
22360 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f  can */.        /
22370 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
22380 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61  able entries tha
22390 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72  t match term pOr
223a0 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Term. */.       
223b0 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c   pSubWInfo = sql
223c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
223d0 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 70  Parse, pOrTab, p
223e0 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30  OrTerm->pExpr, 0
223f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22400 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
22410 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52  OMIT_OPEN | WHER
22420 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c 0a 20  E_OMIT_CLOSE |. 
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 20 20 57 48 45 52 45 5f 46 4f 52         WHERE_FOR
22450 43 45 5f 54 41 42 4c 45 20 7c 20 57 48 45 52 45  CE_TABLE | WHERE
22460 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b  _ONETABLE_ONLY);
22470 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
22480 62 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  bWInfo ){.      
22490 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
224a0 61 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c  ags & WHERE_DUPL
224b0 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b  ICATES_OK)==0 ){
224c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
224d0 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
224e0 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
224f0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
22500 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
22510 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
22520 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
22530 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  n(pParse, pTabIt
22540 65 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43  em->pTab, -1, iC
22550 75 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ur, .           
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
22580 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
22590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
225a0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
225b0 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
225c0 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  owset,.         
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
225f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22600 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20  )+2, r, iSet);. 
22610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22630 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
22640 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
22650 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
22660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
22670 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
22680 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
22690 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
226a0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
226b0 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
226c0 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
226d0 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
226e0 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
226f0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
22700 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
22710 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
22720 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
22730 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
22740 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
22750 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
22760 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22770 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
22780 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
22790 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
227a0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
227b0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
227c0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
227d0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
227e0 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
227f0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
22800 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
22810 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
22820 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
22840 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
22850 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
22860 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
22870 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22880 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
22890 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
228a0 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69  drBrk);.    sqli
228b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
228c0 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79  bel(v, iLoopBody
228d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e  );..    if( pWIn
228e0 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73  fo->nLevel>1 ) s
228f0 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
22900 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 54  pParse->db, pOrT
22910 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
22920 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
22930 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
22940 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
22950 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
22960 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
22970 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
22980 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20      /* Case 5:  
22990 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
229a0 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
229b0 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
229c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
229d0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
229e0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
229f0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
22a00 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
22a10 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
22a20 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
22a30 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
22a40 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
22a50 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
22a60 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
22a70 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
22a80 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
22a90 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  able==0 );.    p
22aa0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
22ab0 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65  p[bRev];.    pLe
22ac0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
22ad0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
22ae0 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
22af0 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74  AddOp2(v, aStart
22b00 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64  [bRev], iCur, ad
22b10 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76  drBrk);.    pLev
22b20 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
22b30 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
22b40 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20  CAN_STEP;.  }.  
22b50 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
22b60 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
22b70 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a  et, iCur);..  /*
22b80 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
22b90 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
22ba0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
22bb0 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
22bc0 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
22bd0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
22be0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
22bf0 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
22c00 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39  NTATION-OF: R-49
22c10 35 32 35 2d 35 30 39 33 35 20 54 65 72 6d 73 20  525-50935 Terms 
22c20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 73  that cannot be s
22c30 61 74 69 73 66 69 65 64 20 74 68 72 6f 75 67 68  atisfied through
22c40 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
22c50 20 69 6e 64 69 63 65 73 20 62 65 63 6f 6d 65 20   indices become 
22c60 74 65 73 74 73 20 74 68 61 74 20 61 72 65 20 65  tests that are e
22c70 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 73 74  valuated against
22c80 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 2a   each row of.  *
22c90 2a 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 69  * the relevant i
22ca0 6e 70 75 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a  nput tables..  *
22cb0 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  k = 0;.  for
22cc0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
22cd0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
22ce0 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
22cf0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
22d00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
22d10 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
22d20 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
22d30 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31 31   IMP: R-30575-11
22d40 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  662 */.    testc
22d50 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c  ase( pTerm->wtFl
22d60 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
22d70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72   );.    if( pTer
22d80 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
22d90 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
22da0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
22db0 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  e;.    if( (pTer
22dc0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
22dd0 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20  otReady)!=0 ){. 
22de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22df0 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54  WInfo->untestedT
22e00 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20  erms==0.        
22e10 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66         && (pWInf
22e20 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22e30 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
22e40 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  NLY)!=0 );.     
22e50 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65   pWInfo->unteste
22e60 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20  dTerms = 1;.    
22e70 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22e80 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  }.    pE = pTerm
22e90 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
22ea0 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
22eb0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
22ec0 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
22ed0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
22ee0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
22ef0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
22f00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22f10 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22f20 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
22f30 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
22f40 4e 55 4c 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31  NULL);.    k = 1
22f50 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
22f60 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
22f70 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ED;.  }..  /* Fo
22f80 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
22f90 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
22fa0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
22fb0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
22fc0 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
22fd0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
22fe0 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
22ff0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
23000 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
23010 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
23020 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
23030 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
23040 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
23050 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
23060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23070 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
23080 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
23090 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
230a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
230b0 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
230c0 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
230d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
230e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
230f0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
23100 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
23110 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
23120 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23130 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
23140 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
23150 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ;  /* IMP: R-305
23160 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
23170 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23180 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23190 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
231a0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
231b0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
231c0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
231d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
231e0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
231f0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
23200 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
23210 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
23220 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
23230 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
23240 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
23250 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
23260 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
23270 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23280 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
23290 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
232a0 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
232b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
232c0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
232d0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
232e0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
232f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
23300 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
23310 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f  g);..  return no
23320 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64  tReady;.}..#if d
23330 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
23340 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ST)./*.** The fo
23350 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
23360 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65   holds a text de
23370 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65  scription of que
23380 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65  ry plan generate
23390 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74  d.** by the most
233a0 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
233b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
233c0 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  n().  Each call 
233d0 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a  to WhereBegin.**
233e0 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
233f0 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20  previous.  This 
23400 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
23410 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
23420 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  and.** analysis 
23430 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  only..*/.char sq
23440 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
23450 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20  [BMS*2*40];  /* 
23460 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  Text of the join
23470 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
23480 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20  QPlan = 0;      
23490 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
234a0 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75  free slow in _qu
234b0 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23  ery_plan[] */..#
234c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
234d0 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
234e0 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
234f0 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
23500 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
23510 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
23520 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
23530 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
23540 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
23550 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
23570 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
23580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
23590 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
235a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
235b0 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
235c0 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
235d0 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
235e0 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
235f0 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62  eIdxStr==0 || db
23600 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23610 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ; */.        if(
23620 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
23630 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
23640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23650 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
23660 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
23670 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
23680 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20  ee(db, pInfo);. 
23690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
236a0 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
236b0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
236c0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b  RE_TEMP_INDEX ){
236d0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
236e0 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  pIdx = pWInfo->a
236f0 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  [i].plan.u.pIdx;
23700 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
23710 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  x ){.          s
23720 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23730 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b   pIdx->zColAff);
23740 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23750 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
23760 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
23770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23780 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
23790 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
237a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
237b0 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
237c0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
237d0 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
237e0 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
237f0 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
23800 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
23810 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
23820 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
23830 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
23840 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
23850 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
23860 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
23870 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
23880 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
23890 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
238a0 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
238b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
238c0 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
238d0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
238e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
238f0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
23900 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
23910 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
23920 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23930 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
23940 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
23950 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
23960 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
23970 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
23980 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
23990 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
239a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
239b0 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
239c0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
239d0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
239e0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
239f0 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
23a00 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
23a10 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23a20 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
23a30 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
23a40 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
23a50 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
23a60 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
23a70 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
23a80 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
23a90 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
23aa0 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
23ab0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
23ac0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
23ad0 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
23ae0 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
23af0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
23b00 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
23b10 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
23b20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
23b30 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
23b40 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
23b50 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
23b60 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
23b70 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
23ba0 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
23bb0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
23bd0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
23be0 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
23c10 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
23c20 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
23c30 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
23c40 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
23c50 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
23c60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23c70 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
23c80 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
23c90 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
23ca0 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
23cb0 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
23cc0 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
23cd0 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
23ce0 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
23cf0 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
23d00 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
23d10 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
23d20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
23d30 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
23d40 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
23d50 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
23d60 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
23d70 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
23d80 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
23d90 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
23da0 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
23db0 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
23dc0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
23dd0 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
23de0 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
23df0 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
23e00 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
23e10 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
23e20 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
23e30 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
23e40 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
23e50 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
23e60 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
23e70 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
23e80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
23e90 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
23ea0 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
23eb0 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
23ec0 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
23ed0 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
23ee0 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
23ef0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
23f00 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
23f10 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
23f20 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
23f30 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
23f40 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
23f50 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
23f60 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
23f70 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
23f80 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
23f90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
23fa0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
23fb0 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
23fc0 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
23fd0 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
23fe0 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
23ff0 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
24000 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
24010 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
24020 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
24030 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
24040 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
24050 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
24060 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
24070 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
24080 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
24090 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
240a0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
240b0 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
240c0 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
240d0 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
240e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
240f0 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
24100 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
24110 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
24120 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
24130 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
24140 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
24150 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
24160 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
24170 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
24180 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
24190 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
241a0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
241b0 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
241c0 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
241d0 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
241e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
241f0 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
24200 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
24210 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
24220 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
24230 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
24240 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
24250 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
24260 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
24270 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
24280 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
24290 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
242a0 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
242b0 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
242c0 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
242d0 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
242e0 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
242f0 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
24300 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
24310 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
24320 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
24330 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
24340 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
24350 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
24360 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
24370 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
24380 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
24390 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
243a0 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
243b0 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
243c0 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
243d0 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
243e0 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
243f0 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
24400 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
24410 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
24420 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
24430 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
24440 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
24450 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
24460 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
24470 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
24480 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
24490 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
244a0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
244b0 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
244c0 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
244d0 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
244e0 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
244f0 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
24500 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
24510 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
24520 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
24530 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
24540 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
24550 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
24560 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
24570 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
24580 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
24590 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
245a0 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
245b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
245c0 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
245d0 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
245e0 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
245f0 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
24600 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
24610 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
24620 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
24630 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
24640 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
24650 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
24660 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
24670 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
24680 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
24690 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
246a0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
246b0 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
246c0 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
246d0 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
246e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
246f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24700 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
24710 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
24720 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
24730 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
24740 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
24750 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
24760 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
24770 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
24780 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24790 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
247a0 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
247b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
247c0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75  , or NULL */.  u
247d0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
247e0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
247f0 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
24800 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
24810 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20  teInt.h */.){.  
24820 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
24830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
24840 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
24850 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20  int nByteWInfo; 
24860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24870 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  m. bytes allocat
24880 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f  ed for WhereInfo
24890 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74   struct */.  int
248a0 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20   nTabList;      
248b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
248c0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
248d0 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
248e0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
248f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
24900 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
24910 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
24920 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
24930 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24940 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
24950 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
24960 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
24970 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
24980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
24990 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
249a0 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
249b0 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
249c0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
249d0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
249e0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
249f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
24a00 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
24a10 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
24a20 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  n of the WHERE c
24a30 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
24a40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24a50 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
24a60 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
24a70 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
24a80 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
24a90 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
24aa0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
24ab0 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
24ac0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
24ad0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
24ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
24af0 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
24b00 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
24b10 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b30 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
24b40 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e  ion of all pWC->
24b50 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20  a[].wtFlags */. 
24b60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
24b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24b80 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
24b90 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  on */..  /* The 
24ba0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
24bb0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
24bc0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
24bd0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
24be0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
24bf0 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
24c00 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
24c10 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
24c20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
24c30 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
24c40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24c50 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
24c60 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
24c70 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
24c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
24c90 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
24ca0 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
24cb0 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
24cc0 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
24cd0 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
24ce0 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
24cf0 65 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  e WHERE_ONETABLE
24d00 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65  _ONLY flag is se
24d10 74 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c  t, then we shoul
24d20 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65  d.  ** only gene
24d30 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
24d40 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e  e first table in
24d50 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73   pTabList and as
24d60 73 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61  sume that.  ** a
24d70 6e 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ny cursors assoc
24d80 69 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65  iated with subse
24d90 71 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65  quent tables are
24da0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
24db0 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20    */.  nTabList 
24dc0 3d 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  = (wctrlFlags & 
24dd0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
24de0 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c  NLY) ? 1 : pTabL
24df0 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a  ist->nSrc;..  /*
24e00 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
24e10 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
24e20 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
24e30 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
24e40 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
24e50 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c  n value. A singl
24e60 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
24e70 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
24e80 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a  e WhereInfo.  **
24e90 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e   struct, the con
24ea0 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e  tents of WhereIn
24eb0 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72  fo.a[], the Wher
24ec0 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
24ed0 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57  e.  ** and the W
24ee0 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75  hereMaskSet stru
24ef0 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65  cture. Since Whe
24f00 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  reClause contain
24f10 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a  s an 8-byte.  **
24f20 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74   field (type Bit
24f30 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65  mask) it must be
24f40 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38   aligned on an 8
24f50 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f  -byte boundary o
24f60 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68  n.  ** some arch
24f70 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65  itectures. Hence
24f80 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65   the ROUND8() be
24f90 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  low..  */.  db =
24fa0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
24fb0 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e  ByteWInfo = ROUN
24fc0 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49  D8(sizeof(WhereI
24fd0 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31  nfo)+(nTabList-1
24fe0 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  )*sizeof(WhereLe
24ff0 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20  vel));.  pWInfo 
25000 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
25010 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
25020 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20   nByteWInfo + . 
25030 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72       sizeof(Wher
25040 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20  eClause) +.     
25050 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73   sizeof(WhereMas
25060 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28  kSet).  );.  if(
25070 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25080 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
25090 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
250a0 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  o);.    pWInfo =
250b0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   0;.    goto whe
250c0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
250d0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
250e0 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
250f0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
25100 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
25110 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
25120 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
25130 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
25140 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25150 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  (v);.  pWInfo->p
25160 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72  WC = pWC = (Wher
25170 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20  eClause *)&((u8 
25180 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57  *)pWInfo)[nByteW
25190 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d  Info];.  pWInfo-
251a0 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63  >wctrlFlags = wc
251b0 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e  trlFlags;.  pWIn
251c0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
251d0 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
251e0 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73  ueryLoop;.  pMas
251f0 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73  kSet = (WhereMas
25200 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a  kSet*)&pWC[1];..
25210 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
25220 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
25230 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
25240 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
25250 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
25260 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
25270 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
25280 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  erator..  */.  i
25290 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b  nitMaskSet(pMask
252a0 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61  Set);.  whereCla
252b0 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61  useInit(pWC, pPa
252c0 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
252d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
252e0 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73  eConstants(pPars
252f0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68  e, pWhere);.  wh
25300 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57  ereSplit(pWC, pW
25310 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20 20  here, TK_AND);  
25320 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34 32   /* IMP: R-15842
25330 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a 20  -53296 */.    . 
25340 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
25350 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
25360 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
25370 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
25380 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
25390 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
253a0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
253b0 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
253c0 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
253d0 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69  Where && (nTabLi
253e0 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
253f0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
25400 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
25410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
25420 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
25430 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
25440 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  >iBreak, SQLITE_
25450 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
25460 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
25470 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20  ..  /* Assign a 
25480 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74  bit from the bit
25490 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65  mask to every te
254a0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
254b0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
254c0 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20   When assigning 
254d0 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74  bitmask values t
254e0 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75  o FROM clause cu
254f0 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62  rsors, it must b
25500 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20  e.  ** the case 
25510 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65  that if X is the
25520 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
25530 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   N-th FROM claus
25540 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a  e term then.  **
25550 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
25560 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
25570 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65   terms to the le
25580 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74  ft of the N-th t
25590 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31  erm.  ** is (X-1
255a0 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69  ).   An expressi
255b0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63  on from the ON c
255c0 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20  lause of a LEFT 
255d0 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a  JOIN can use.  *
255e0 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68  * its Expr.iRigh
255f0 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65  tJoinTable value
25600 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74   to find the bit
25610 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68  mask of the righ
25620 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20  t table.  ** of 
25630 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72  the join.  Subtr
25640 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20  acting one from 
25650 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
25660 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a  bitmask gives a.
25670 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72    ** bitmask for
25680 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74   all tables to t
25690 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a  he left of the j
256a0 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68  oin.  Knowing th
256b0 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66  e bitmask.  ** f
256c0 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  or all tables to
256d0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c   the left of a l
256e0 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f  eft join is impo
256f0 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23  rtant.  Ticket #
25700 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3015..  **.  ** 
25710 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57 68  Configure the Wh
25720 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b 20  ereClause.vmask 
25730 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74  variable so that
25740 20 62 69 74 73 20 74 68 61 74 20 63 6f 72 72 65   bits that corre
25750 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76 69  spond.  ** to vi
25760 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
25770 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  ors are set. Thi
25780 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 6c  s is used to sel
25790 65 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c 65  ectively disable
257a0 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74 6f   .  ** the OR-to
257b0 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  -IN transformati
257c0 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79 7a  on in exprAnalyz
257d0 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69 73  eOrTerm(). It is
257e0 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20 20   not helpful .  
257f0 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  ** with virtual 
25800 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
25810 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74 6d  * Note that bitm
25820 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65 64  asks are created
25830 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69 73   for all pTabLis
25840 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20 69  t->nSrc tables i
25850 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c  n.  ** pTabList,
25860 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66 69   not just the fi
25870 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61 62  rst nTabList tab
25880 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20 69  les.  nTabList i
25890 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20  s normally.  ** 
258a0 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73  equal to pTabLis
258b0 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68  t->nSrc but migh
258c0 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74  t be shortened t
258d0 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  o 1 if the.  ** 
258e0 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
258f0 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2e  NLY flag is set.
25900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25910 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26  pWC->vmask==0 &&
25920 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20   pMaskSet->n==0 
25930 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
25940 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
25950 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
25960 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
25970 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
25980 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20  ursor);.#ifndef 
25990 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
259a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
259b0 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74   ALWAYS(pTabList
259c0 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20  ->a[i].pTab) && 
259d0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69  IsVirtual(pTabLi
259e0 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29  st->a[i].pTab) )
259f0 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61  {.      pWC->vma
25a00 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  sk |= ((Bitmask)
25a10 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  1 << i);.    }.#
25a20 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65  endif.  }.#ifnde
25a30 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
25a40 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
25a50 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
25a60 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
25a70 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
25a80 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
25a90 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
25aa0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
25ab0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
25ac0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
25ad0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
25ae0 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
25af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
25b00 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
25b10 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
25b20 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
25b30 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
25b40 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
25b50 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
25b60 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
25b70 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
25b80 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
25b90 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
25ba0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
25bb0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
25bc0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
25bd0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
25be0 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
25bf0 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
25c00 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
25c10 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
25c20 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
25c30 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
25c40 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66  List, pWC);.  if
25c50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25c60 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
25c70 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
25c80 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
25c90 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
25ca0 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
25cb0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
25cc0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
25cd0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
25ce0 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
25cf0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
25d00 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
25d10 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
25d20 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
25d30 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
25d40 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
25d50 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73    pWInfo->a[].ws
25d60 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78  Flags   WHERE_xx
25d70 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
25d80 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
25d90 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
25da0 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
25db0 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
25dc0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
25dd0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
25de0 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68  .iFrom     Which
25df0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
25e00 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
25e10 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
25e20 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
25e30 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
25e40 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
25e50 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
25e60 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
25e70 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
25e80 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
25e90 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57   index.  **   pW
25ea0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20  Info->a[].pTerm 
25eb0 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73      When wsFlags
25ec0 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d  ==WO_OR, the OR-
25ed0 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a  clause term.  **
25ee0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
25ef0 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
25f00 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
25f10 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
25f20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
25f30 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
25f40 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
25f50 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
25f60 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
25f70 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
25f80 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
25f90 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
25fa0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
25fb0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
25fc0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
25fd0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
25fe0 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74  o->a; i<nTabList
25ff0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
26000 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74 20  {.    WhereCost 
26010 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20  bestPlan;       
26020 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69    /* Most effici
26030 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f  ent plan seen so
26040 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65   far */.    Inde
26050 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
26060 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26070 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
26080 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
26090 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
260c0 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
260d0 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20  /.    int bestJ 
260e0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
260f0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
26100 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61  f j */.    Bitma
26110 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20  sk m;           
26120 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
26130 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72  k value for j or
26140 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e   bestJ */.    in
26150 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20  t isOptimal;    
26160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
26170 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61  rator for optima
26180 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65  l/non-optimal se
26190 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  arch */.    int 
261a0 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20  nUnconstrained; 
261b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
261c0 72 20 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74  r tables without
261d0 20 49 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a 20   INDEXED BY */. 
261e0 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e     Bitmask notIn
261f0 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 2f  dexed;         /
26200 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
26210 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65   that cannot use
26220 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   an index */..  
26230 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c    memset(&bestPl
26240 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65  an, 0, sizeof(be
26250 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65  stPlan));.    be
26260 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53  stPlan.rCost = S
26270 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a  QLITE_BIG_DBL;..
26280 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
26290 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ugh the remainin
262a0 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  g entries in the
262b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
262c0 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  find the.    ** 
262d0 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70  next nested loop
262e0 2e 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73  . The loop tests
262f0 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
26300 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
26310 65 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74  either once or t
26320 77 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  wice. .    **.  
26330 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74    ** The first t
26340 65 73 74 20 69 73 20 61 6c 77 61 79 73 20 70 65  est is always pe
26350 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65  rformed if there
26360 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
26370 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
26380 72 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65  remaining and ne
26390 76 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66  ver performed if
263a0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
263b0 6e 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ne FROM clause e
263c0 6e 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63  ntry.    ** to c
263d0 68 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65  hoose from.  The
263e0 20 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b   first test look
263f0 73 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61  s for an "optima
26400 6c 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20  l" scan.  In.   
26410 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74   ** this context
26420 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
26430 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65   is one that use
26440 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74  s the same strat
26450 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  egy.    ** for t
26460 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c  he given FROM cl
26470 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f  ause entry as wo
26480 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20  uld be selected 
26490 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20  if the entry.   
264a0 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73   ** were used as
264b0 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e   the innermost n
264c0 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20  ested loop.  In 
264d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74  other words, a t
264e0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63  able.    ** is c
264f0 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20  hosen such that 
26500 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e  the cost of runn
26510 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63  ing that table c
26520 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  annot be reduced
26530 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69  .    ** by waiti
26540 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62  ng for other tab
26550 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74  les to run first
26560 2e 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c  .  This "optimal
26570 22 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20  " test works.   
26580 20 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73 73   ** by first ass
26590 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 46  uming that the F
265a0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e  ROM clause is on
265b0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
265c0 61 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20  and finding.    
265d0 2a 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c 61  ** its query pla
265e0 6e 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67  n, then checking
265f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 20   to see if that 
26600 71 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20  query plan uses 
26610 61 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  any.    ** other
26620 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
26630 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 52  ms that are notR
26640 65 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f 74  eady.  If no not
26650 52 65 61 64 79 20 74 65 72 6d 73 20 61 72 65 0a  Ready terms are.
26660 20 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65 6e      ** used then
26670 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71   the "optimal" q
26680 75 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e  uery plan works.
26690 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
266a0 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69  he second loop i
266b0 74 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  teration is only
266c0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f   performed if no
266d0 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20   optimal scan.  
266e0 20 20 2a 2a 20 73 74 72 61 74 65 67 69 65 73 20    ** strategies 
266f0 77 65 72 65 20 66 6f 75 6e 64 20 62 79 20 74 68  were found by th
26700 65 20 66 69 72 73 74 20 6c 6f 6f 70 2e 20 54 68  e first loop. Th
26710 69 73 20 32 6e 64 20 69 74 65 72 61 74 69 6f 6e  is 2nd iteration
26720 20 69 73 20 75 73 65 64 20 74 6f 0a 20 20 20 20   is used to.    
26730 2a 2a 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  ** search for th
26740 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63  e lowest cost sc
26750 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20  an overall..    
26760 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76 69 6f  **.    ** Previo
26770 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  us versions of S
26780 51 4c 69 74 65 20 70 65 72 66 6f 72 6d 65 64 20  QLite performed 
26790 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e 64 20  only the second 
267a0 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20  iteration -.    
267b0 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65  ** the next oute
267c0 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20 61  rmost loop was a
267d0 6c 77 61 79 73 20 74 68 61 74 20 77 69 74 68 20  lways that with 
267e0 74 68 65 20 6c 6f 77 65 73 74 20 6f 76 65 72 61  the lowest overa
267f0 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20  ll.    ** cost. 
26800 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d 65  However, this me
26810 61 6e 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  ant that SQLite 
26820 63 6f 75 6c 64 20 73 65 6c 65 63 74 20 74 68 65  could select the
26830 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20   wrong plan.    
26840 2a 2a 20 66 6f 72 20 73 63 72 69 70 74 73 20 73  ** for scripts s
26850 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f  uch as the follo
26860 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a  wing:.    **   .
26870 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
26880 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20  TABLE t1(a, b); 
26890 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
268a0 20 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b   TABLE t2(c, d);
268b0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
268c0 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57   * FROM t2, t1 W
268d0 48 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20  HERE t2.rowid = 
268e0 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  t1.a;.    **.   
268f0 20 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74 72   ** The best str
26900 61 74 65 67 79 20 69 73 20 74 6f 20 69 74 65 72  ategy is to iter
26910 61 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c  ate through tabl
26920 65 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65  e t1 first. Howe
26930 76 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  ver it.    ** is
26940 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
26950 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20   determine this 
26960 77 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72  with a simple gr
26970 65 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  eedy algorithm..
26980 20 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65      ** Since the
26990 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61   cost of a linea
269a0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
269b0 61 62 6c 65 20 74 32 20 69 73 20 74 68 65 20 73  able t2 is the s
269c0 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74  ame .    ** as t
269d0 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e  he cost of a lin
269e0 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
269f0 20 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d   table t1, a sim
26a00 70 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20 20  ple greedy .    
26a10 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79  ** algorithm may
26a20 20 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74   choose to use t
26a30 32 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  2 for the outer 
26a40 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61  loop, which is a
26a50 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73   much.    ** cos
26a60 74 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a  tlier approach..
26a70 20 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f      */.    nUnco
26a80 6e 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20  nstrained = 0;. 
26a90 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20     notIndexed = 
26aa0 30 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74  0;.    for(isOpt
26ab0 69 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62  imal=(iFrom<nTab
26ac0 4c 69 73 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d  List-1); isOptim
26ad0 61 6c 3e 3d 30 3b 20 69 73 4f 70 74 69 6d 61 6c  al>=0; isOptimal
26ae0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
26af0 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  sk mask;        
26b00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
26b10 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74 20 72  tables not yet r
26b20 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20 66 6f  eady */.      fo
26b30 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
26b40 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
26b50 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b  [j]; j<nTabList;
26b60 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
26b70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ){.        int d
26b80 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20  oNotReorder;    
26b90 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
26ba0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74  table should not
26bb0 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f   be reordered */
26bc0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f  .        WhereCo
26bd0 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a  st sCost;     /*
26be0 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f   Cost informatio
26bf0 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74  n from best[Virt
26c00 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20  ual]Index() */. 
26c10 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
26c20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f  *pOrderBy;  /* O
26c30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
26c40 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69  or index to opti
26c50 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20  mize */.  .     
26c60 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
26c70 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
26c80 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
26c90 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
26ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d  .        if( j!=
26cb0 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65  iFrom && doNotRe
26cc0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
26cd0 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61         m = getMa
26ce0 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
26cf0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
26d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 20  .        if( (m 
26d10 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
26d20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26d30 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d  j==iFrom ) iFrom
26d40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
26d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26d60 7d 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d  }.        mask =
26d70 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d 20   (isOptimal ? m 
26d80 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  : notReady);.   
26d90 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
26da0 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65  ((i==0 && ppOrde
26db0 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42 79  rBy )?*ppOrderBy
26dc0 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :0);.        if(
26dd0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
26de0 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73 74 72  x==0 ) nUnconstr
26df0 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20 20 20  ained++;.  .    
26e00 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
26e10 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69  Item->pTab );.#i
26e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26e30 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
26e40 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
26e50 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
26e60 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
26e70 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
26e80 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49  info **pp = &pWI
26e90 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
26ea0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  fo;.          be
26eb0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
26ec0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
26ed0 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64  Item, mask, pOrd
26ee0 65 72 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70  erBy, &sCost, pp
26ef0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
26f00 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
26f10 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73   {.          bes
26f20 74 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72  tBtreeIndex(pPar
26f30 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
26f40 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42  m, mask, pOrderB
26f50 79 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20  y, &sCost);.    
26f60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
26f70 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20  sert( isOptimal 
26f80 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e  || (sCost.used&n
26f90 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a  otReady)==0 );..
26fa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
26fb0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
26fc0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
26fd0 68 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d 75 73  hen the plan mus
26fe0 74 20 75 73 65 20 74 68 61 74 0a 20 20 20 20 20  t use that.     
26ff0 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 66 20 69     ** index if i
27000 74 20 75 73 65 73 20 61 6e 79 20 69 6e 64 65 78  t uses any index
27010 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20 20 20   at all */.     
27020 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49     assert( pTabI
27030 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a  tem->pIndex==0 .
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e    || (sCost.plan
27060 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
27070 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d  _NOT_FULLSCAN)==
27080 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27090 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e 70 6c 61      || sCost.pla
270a0 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61 62 49 74  n.u.pIdx==pTabIt
270b0 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 0a 20  em->pIndex );.. 
270c0 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 74         if( isOpt
270d0 69 6d 61 6c 20 26 26 20 28 73 43 6f 73 74 2e 70  imal && (sCost.p
270e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
270f0 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e  ERE_NOT_FULLSCAN
27100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27110 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c 3d 20    notIndexed |= 
27120 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  m;.        }..  
27130 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
27140 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68 20  ons under which 
27150 74 68 69 73 20 74 61 62 6c 65 20 62 65 63 6f 6d  this table becom
27160 65 73 20 74 68 65 20 62 65 73 74 20 73 6f 20 66  es the best so f
27170 61 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ar:.        **. 
27180 20 20 20 20 20 20 20 2a 2a 20 20 20 28 31 29 20         **   (1) 
27190 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e  The table must n
271a0 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f 74 68  ot depend on oth
271b0 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 68  er tables that h
271c0 61 76 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  ave not.        
271d0 2a 2a 20 20 20 20 20 20 20 79 65 74 20 72 75 6e  **       yet run
271e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
271f0 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20 41 20       **   (2) A 
27200 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20  full-table-scan 
27210 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73 75 70 65  plan cannot supe
27220 72 63 65 64 65 20 61 6e 6f 74 68 65 72 20 70 6c  rcede another pl
27230 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20 20 20 20  an unless.      
27240 20 20 2a 2a 20 20 20 20 20 20 20 69 74 20 69 73    **       it is
27250 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c   an "optimal" pl
27260 61 6e 20 61 73 20 64 65 66 69 6e 65 64 20 61 62  an as defined ab
27270 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ove..        **.
27280 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 33 29          **   (3)
27290 20 41 6c 6c 20 74 61 62 6c 65 73 20 68 61 76 65   All tables have
272a0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
272b0 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61  lause or this ta
272c0 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20  ble lacks an.   
272d0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 49 4e       **       IN
272e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
272f0 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 75 73  or this table us
27300 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63 0a  es the specific.
27310 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
27320 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
27330 20 62 79 20 69 74 73 20 49 4e 44 45 58 45 44 20   by its INDEXED 
27340 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73  BY clause.  This
27350 20 72 75 6c 65 20 65 6e 73 75 72 65 73 0a 20 20   rule ensures.  
27360 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
27370 68 61 74 20 61 20 62 65 73 74 2d 73 6f 2d 66 61  hat a best-so-fa
27380 72 20 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65  r is always sele
27390 63 74 65 64 20 65 76 65 6e 20 69 66 20 61 6e 20  cted even if an 
273a0 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  impossible.     
273b0 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62     **       comb
273c0 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58  ination of INDEX
273d0 45 44 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  ED BY clauses ar
273e0 65 20 67 69 76 65 6e 2e 20 20 54 68 65 20 65 72  e given.  The er
273f0 72 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ror.        **  
27400 20 20 20 20 20 77 69 6c 6c 20 62 65 20 64 65 74       will be det
27410 65 63 74 65 64 20 61 6e 64 20 72 65 6c 61 79 65  ected and relaye
27420 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 61 70  d back to the ap
27430 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e  plication later.
27440 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
27450 20 20 54 68 65 20 4e 45 56 45 52 28 29 20 63 6f    The NEVER() co
27460 6d 65 73 20 61 62 6f 75 74 20 62 65 63 61 75 73  mes about becaus
27470 65 20 72 75 6c 65 20 28 32 29 20 61 62 6f 76 65  e rule (2) above
27480 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
27490 20 20 2a 2a 20 20 20 20 20 20 20 41 6e 20 69 6e    **       An in
274a0 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62  dexable full-tab
274b0 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20 72 65 61  le-scan from rea
274c0 63 68 69 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a  ching rule (3)..
274d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
274e0 20 20 20 2a 2a 20 20 20 28 34 29 20 54 68 65 20     **   (4) The 
274f0 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73 74 20 62  plan cost must b
27500 65 20 6c 6f 77 65 72 20 74 68 61 6e 20 70 72 69  e lower than pri
27510 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65  or plans or else
27520 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
27530 20 20 20 20 20 20 63 6f 73 74 20 6d 75 73 74 20        cost must 
27540 62 65 20 74 68 65 20 73 61 6d 65 20 61 6e 64 20  be the same and 
27550 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
27560 77 73 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72  ws must be lower
27570 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27580 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74 2e       if( (sCost.
27590 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
275a0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
275b0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
275c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  /.            &&
275d0 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f   (bestJ<0 || (no
275e0 74 49 6e 64 65 78 65 64 26 6d 29 21 3d 30 20 20  tIndexed&m)!=0  
275f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27600 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
27610 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74         || (sCost
27620 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
27630 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
27640 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20 20  AN)!=0).        
27650 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74      && (nUnconst
27660 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54 61  rained==0 || pTa
27670 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30  bItem->pIndex==0
27680 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
27690 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
276a0 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c 61  NEVER((sCost.pla
276b0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
276c0 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21  E_NOT_FULLSCAN)!
276d0 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  =0)).           
276e0 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20   && (bestJ<0 || 
276f0 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74  sCost.rCost<best
27700 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20 20  Plan.rCost      
27710 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
27720 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
27730 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50  ost.rCost<=bestP
27740 6c 61 6e 2e 72 43 6f 73 74 20 26 26 20 73 43 6f  lan.rCost && sCo
27750 73 74 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e  st.nRow<bestPlan
27760 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20 20 20  .nRow)).        
27770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 48 45  ){.          WHE
27780 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65  RETRACE(("... be
27790 73 74 20 73 6f 20 66 61 72 20 77 69 74 68 20 63  st so far with c
277a0 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77 3d  ost=%g and nRow=
277b0 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %g\n",.         
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f               sCo
277d0 73 74 2e 72 43 6f 73 74 2c 20 73 43 6f 73 74 2e  st.rCost, sCost.
277e0 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20  nRow));.        
277f0 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f    bestPlan = sCo
27800 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  st;.          be
27810 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  stJ = j;.       
27820 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   }.        if( d
27830 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
27840 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
27850 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62   }.    assert( b
27860 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61  estJ>=0 );.    a
27870 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20  ssert( notReady 
27880 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  & getMask(pMaskS
27890 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
278a0 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20  bestJ].iCursor) 
278b0 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
278c0 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
278d0 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20  r selects table 
278e0 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e  %d for loop %d\n
278f0 22 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20  ", bestJ,.      
27900 20 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e       pLevel-pWIn
27910 66 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28  fo->a));.    if(
27920 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
27930 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
27940 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20  ORDERBY)!=0 ){. 
27950 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
27960 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
27970 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 50  ndFlags &= bestP
27980 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
27990 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 6c  ;.    pLevel->pl
279a0 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  an = bestPlan.pl
279b0 61 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  an;.    testcase
279c0 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
279d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
279e0 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 20 20 74  INDEXED );.    t
279f0 65 73 74 63 61 73 65 28 20 62 65 73 74 50 6c 61  estcase( bestPla
27a00 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
27a10 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
27a20 58 20 29 3b 0a 20 20 20 20 69 66 28 20 62 65 73  X );.    if( bes
27a30 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
27a40 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45  gs & (WHERE_INDE
27a50 58 45 44 7c 57 48 45 52 45 5f 54 45 4d 50 5f 49  XED|WHERE_TEMP_I
27a60 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 20 20 70  NDEX) ){.      p
27a70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
27a80 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
27a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27aa0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
27ab0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
27ac0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
27ad0 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
27ae0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
27af0 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
27b00 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
27b10 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 20 20 20  = (u8)bestJ;.   
27b20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 6e 52   if( bestPlan.nR
27b30 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 20  ow>=(double)1 ) 
27b40 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
27b50 6f 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 6e  op *= bestPlan.n
27b60 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  Row;..    /* Che
27b70 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74  ck that if the t
27b80 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20  able scanned by 
27b90 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
27ba0 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a  ion had an.    *
27bb0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
27bc0 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
27bd0 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d  it, that the nam
27be0 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  ed index is bein
27bf0 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f  g.    ** used fo
27c00 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e  r the scan. If n
27c10 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63  ot, then query c
27c20 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66  ompilation has f
27c30 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65  ailed..    ** Re
27c40 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
27c50 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d     */.    pIdx =
27c60 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
27c70 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  tJ].pIndex;.    
27c80 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
27c90 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
27ca0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
27cb0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
27cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27cd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27ce0 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
27cf0 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78  index: %s", pIdx
27d00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
27d10 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
27d20 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  nError;.      }e
27d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27d40 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
27d50 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c   clause is used,
27d60 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
27d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20   function is.   
27d80 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
27d90 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  ed to find the i
27da0 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69  ndex specified i
27db0 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  n the INDEXED BY
27dc0 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
27dd0 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e  ** if it find an
27de0 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a   index at all. *
27df0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
27e00 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
27e10 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a  u.pIdx==pIdx );.
27e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e30 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  }.  WHERETRACE((
27e40 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
27e50 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
27e60 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
27e70 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
27e80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
27e90 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
27ea0 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
27eb0 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
27ec0 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
27ed0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
27ee0 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
27ef0 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
27f00 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
27f10 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
27f20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
27f30 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
27f40 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
27f50 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
27f60 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
27f70 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
27f80 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
27f90 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
27fa0 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
27fb0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
27fc0 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
27fd0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
27fe0 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
27ff0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
28000 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
28010 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
28020 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
28030 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
28040 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
28050 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
28060 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
28070 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
28080 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
28090 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
280a0 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
280b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
280c0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
280d0 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61  D)!=0 && (andFla
280e0 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
280f0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  E)!=0 ){.    pWI
28100 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
28110 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   1;.    pWInfo->
28120 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  a[0].plan.wsFlag
28130 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
28140 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
28150 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
28160 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
28170 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
28180 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
28190 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
281a0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
281b0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
281c0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
281d0 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
281e0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
281f0 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f  ier Goto */.  no
28200 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
28210 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  sk)0;.  for(i=0,
28220 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
28230 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  a; i<nTabList; i
28240 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
28250 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
28260 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
28270 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
28280 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
28290 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
282a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
282b0 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66  le/index */..#if
282c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
282d0 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
282e0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
282f0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==2 ){.      cha
28300 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73  r *zMsg;.      s
28310 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
28320 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
28330 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
28340 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a  >iFrom];.      z
28350 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
28360 69 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20  intf(db, "TABLE 
28370 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
28380 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
28390 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
283a0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
283b0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
283c0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25  , zMsg, "%s AS %
283d0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
283e0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
283f0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65  }.      if( (pLe
28400 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
28410 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
28420 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
28430 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
28440 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
28450 4d 73 67 2c 20 22 25 73 20 57 49 54 48 20 41 55  Msg, "%s WITH AU
28460 54 4f 4d 41 54 49 43 20 49 4e 44 45 58 22 2c 20  TOMATIC INDEX", 
28470 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
28480 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e  se if( (pLevel->
28490 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
284a0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
284b0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
284c0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
284d0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
284e0 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c   WITH INDEX %s",
284f0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67  .           zMsg
28500 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  , pLevel->plan.u
28510 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pIdx->zName);. 
28520 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
28530 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
28540 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
28550 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  I_OR ){.        
28560 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
28570 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
28580 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49   "%s VIA MULTI-I
28590 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73  NDEX UNION", zMs
285a0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
285b0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
285c0 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
285d0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
285e0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
285f0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
28600 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
28610 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
28620 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
28630 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
28640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28650 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28660 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
28670 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
28680 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
28690 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
286a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
286b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
286c0 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
286d0 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
286e0 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  x;.        zMsg 
286f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
28700 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
28710 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
28720 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
28730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28740 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
28750 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
28760 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
28770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
28780 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
28790 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
287a0 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
287b0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
287c0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
287d0 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42  Msg, "%s ORDER B
287e0 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
287f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
28800 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28810 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
28820 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
28830 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
28840 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
28850 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
28860 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
28870 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
28880 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
28890 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
288a0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
288b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
288c0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
288d0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 44 62  iCursor;.    iDb
288e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
288f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
28900 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
28910 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
28920 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
28930 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
28940 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
28950 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
28960 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
28970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28980 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
28990 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
289a0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
289b0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
289c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
289d0 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
289e0 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
289f0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
28a00 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
28a10 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
28a20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
28a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28a40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
28a50 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
28a60 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
28a70 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
28a80 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
28a90 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
28aa0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
28ab0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
28ac0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
28ad0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d  HERE_OMIT_OPEN)=
28ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
28af0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
28b00 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
28b10 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
28b20 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
28b30 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
28b40 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
28b50 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
28b60 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73  , op);.      tes
28b70 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f  tcase( pTab->nCo
28b80 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
28b90 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
28ba0 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ->nCol==BMS );. 
28bb0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
28bc0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
28bd0 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b  Tab->nCol<BMS ){
28be0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
28bf0 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
28c00 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
28c10 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
28c20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
28c30 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
28c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28c50 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
28c60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
28c70 28 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  (v)-1, .        
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
28ca0 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54  O_PTR(n), P4_INT
28cb0 33 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  32);.        ass
28cc0 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
28cd0 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
28ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
28cf0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
28d00 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
28d10 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
28d20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
28d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28d40 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
28d50 44 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65  DEX.    if( (pLe
28d60 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
28d70 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
28d80 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
28d90 20 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d    constructAutom
28da0 61 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65  aticIndex(pParse
28db0 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
28dc0 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
28dd0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  l);.    }else.#e
28de0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
28df0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
28e00 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28e10 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)!=0 ){.      
28e20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65  Index *pIx = pLe
28e30 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
28e40 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
28e50 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49  *pKey = sqlite3I
28e60 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
28e70 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20  se, pIx);.      
28e80 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
28e90 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
28ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78       assert( pIx
28eb0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
28ec0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
28ed0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75    assert( iIdxCu
28ee0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
28ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28f00 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
28f10 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  iIdxCur, pIx->tn
28f20 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
28f50 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
28f60 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
28f70 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
28f80 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
28f90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
28fa0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
28fb0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
28fc0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
28fd0 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
28fe0 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
28ff0 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
29000 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
29010 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
29020 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64  Addr(v);.  if( d
29030 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
29040 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
29050 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65  nError;..  /* Ge
29060 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
29070 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
29080 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
29090 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
290a0 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
290b0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
290c0 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
290d0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
290e0 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
290f0 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
29100 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
29110 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73  r(i=0; i<nTabLis
29120 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 6f 74  t; i++){.    not
29130 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c  Ready = codeOneL
29140 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
29150 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20   i, wctrlFlags, 
29160 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70  notReady);.    p
29170 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
29180 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
29190 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
291a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
291b0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
291c0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
291d0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
291e0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
291f0 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
29200 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
29210 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
29220 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
29230 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
29240 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
29250 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
29260 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
29270 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
29280 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
29290 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
292a0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
292b0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
292c0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
292d0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
292e0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
292f0 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
29300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62   for(i=0; i<nTab
29310 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  List; i++){.    
29320 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
29330 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
29340 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
29350 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
29360 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
29370 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
29380 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
29390 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
293a0 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
293b0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
293c0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
293d0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
293e0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
293f0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
29400 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
29410 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
29420 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29430 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
29440 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
29450 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
29460 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
29470 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
29480 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
29490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
294a0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
294b0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
294c0 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
294d0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
294e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
294f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
29500 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
29510 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
29520 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
29530 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
29540 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
29550 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29560 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
29570 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
29580 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
29590 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
295a0 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
295b0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
295c0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
295d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
295e0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
295f0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
29600 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
29610 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
29620 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
29630 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
29640 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
29650 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
29660 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
29670 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
29680 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29690 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
296a0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
296b0 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
296c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
296d0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
296e0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
296f0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
29700 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
29710 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
29720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29730 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
29740 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
29750 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
29760 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
29770 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
29780 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
29790 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
297a0 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
297b0 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
297c0 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
297d0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
297e0 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
297f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
29800 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
29810 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
29820 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
29830 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
29840 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
29850 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
29860 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
29870 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
29880 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
29890 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
298a0 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
298b0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
298c0 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
298d0 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
298e0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
298f0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
29900 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
29910 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
29920 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
29930 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
29940 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
29950 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
29960 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
29970 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
29980 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
29990 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
299a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
299b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
299c0 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
299d0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
299e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
299f0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
29a00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
29a10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
29a20 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
29a30 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
29a40 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
29a50 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
29a60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
29a70 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
29a80 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
29a90 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
29aa0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
29ab0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
29ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
29ad0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
29ae0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
29af0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
29b00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
29b10 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
29b20 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
29b30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
29b40 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
29b50 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
29b60 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
29b70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29b80 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
29b90 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
29ba0 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
29bb0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
29bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29bd0 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
29be0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
29bf0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
29c00 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29c10 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
29c20 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
29c30 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
29c40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
29c50 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
29c60 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
29c70 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
29c80 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
29c90 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
29ca0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
29cb0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
29cc0 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
29cd0 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
29ce0 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
29cf0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
29d00 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
29d10 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
29d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
29d30 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
29d40 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
29d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
29d70 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
29d80 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
29d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29da0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
29db0 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
29dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
29dd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
29de0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
29df0 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
29e00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
29e10 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
29e20 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
29e30 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
29e40 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
29e50 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
29e60 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
29e70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
29e80 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
29e90 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
29ea0 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
29eb0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29ec0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
29ed0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
29ee0 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  | (pLevel->plan.
29ef0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29f00 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
29f10 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
29f20 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
29f30 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
29f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
29f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
29f60 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
29f70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
29f80 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
29f90 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
29fa0 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
29fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29fc0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
29fd0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
29fe0 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
29ff0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
2a000 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
2a010 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
2a020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a030 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
2a040 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
2a050 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
2a060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a080 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2a090 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
2a0a0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
2a0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a0c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2a0d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
2a0e0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
2a0f0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
2a100 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
2a110 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
2a120 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
2a130 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2a140 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2a150 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
2a160 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
2a170 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
2a180 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
2a190 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
2a1a0 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
2a1b0 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
2a1c0 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57  >nLevel==1 || pW
2a1d0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54  Info->nLevel==pT
2a1e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2a1f0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2a200 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
2a210 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2a220 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2a230 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2a240 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
2a250 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2a260 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
2a270 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2a280 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
2a290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2a2a0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2a2b0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2a2c0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2a2d0 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
2a2e0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
2a2f0 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
2a300 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a310 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OMIT_CLOSE)==0.
2a320 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
2a330 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c   ws = pLevel->pl
2a340 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
2a350 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
2a360 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20  kOnePass && (ws 
2a370 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2a380 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a3a0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
2a3b0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2a3c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a3d0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2a3e0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
2a3f0 28 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  (ws & WHERE_TEMP
2a400 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20  _INDEX)==0 ){.  
2a410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a420 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
2a430 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
2a440 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2a450 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2a460 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
2a470 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
2a480 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
2a490 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
2a4a0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
2a4b0 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
2a4c0 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
2a4d0 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
2a4e0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
2a4f0 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
2a500 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
2a510 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
2a520 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
2a530 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
2a540 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
2a550 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
2a560 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
2a570 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
2a580 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
2a590 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
2a5a0 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
2a5b0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
2a5c0 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
2a5d0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
2a5e0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
2a5f0 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
2a600 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
2a610 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
2a620 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
2a630 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
2a640 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
2a650 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
2a660 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
2a670 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
2a680 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
2a690 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
2a6a0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
2a6b0 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
2a6c0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
2a6d0 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
2a6e0 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
2a6f0 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
2a700 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
2a710 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
2a720 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2a730 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2a740 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
2a750 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
2a760 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  ed){.      int k
2a770 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
2a780 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
2a790 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
2a7a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
2a7b0 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73  .pIdx;..      as
2a7c0 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
2a7d0 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
2a7e0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2a7f0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
2a800 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
2a810 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2a820 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
2a830 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
2a840 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
2a850 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
2a860 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
2a870 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
2a880 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2a890 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2a8a0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
2a8b0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2a8c0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
2a8d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2a8e0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
2a8f0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
2a900 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
2a910 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
2a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a930 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2a940 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2a950 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a980 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
2a990 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2a9a0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2a9b0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
2a9c0 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e       || j<pIdx->
2a9d0 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
2a9e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
2a9f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
2aa00 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
2aa10 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
2aa20 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
2aa30 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
2aa40 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
2aa50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2aa70 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
2aa80 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
2aa90 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2aaa0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2aab0 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
2aac0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2aad0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.