/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact dcc0d91cc4b843adf79476b721c10ca6f382cb85:


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 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65  ral index */.#de
2c40: 66 69 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49  fine WHERE_DISTI
2c50: 4e 43 54 20 20 20 20 20 30 78 34 30 30 30 30 30  NCT     0x400000
2c60: 30 30 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f  00  /* Correct o
2c70: 72 64 65 72 20 66 6f 72 20 44 49 53 54 49 4e 43  rder for DISTINC
2c80: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  T */../*.** Init
2c90: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
2ca0: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
2cb0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2cd0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
2ce0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d00: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
2d10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2d20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d40: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2d50: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2d60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
2d70: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
2d90: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
2da0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
2db0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2dc0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
2dd0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
2de0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
2df0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
2e00: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
2e10: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2e20: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
2e30: 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a  pWC->vmask = 0;.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2e70: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2e80: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2e90: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2ea0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2eb0: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2ec0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2ed0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2ee0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2ef0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2f00: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2f10: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2f20: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2f30: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2f40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2f50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2f60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2f70: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2f80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f90: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2fa0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2fb0: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2fc0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2fd0: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ff0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3000: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
3010: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
3020: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
3030: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
3040: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
3050: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
3060: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
3070: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
3080: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
30a0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
30b0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
30c0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
30d0: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
30e0: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
30f0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
3100: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
3110: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
3120: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
3130: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3140: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3160: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
3170: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
3180: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3190: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
31a0: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
31b0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
31c0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
31d0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
31e0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
31f0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
3200: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
3210: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
3220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3230: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
3240: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
3250: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3260: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
3270: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
3280: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
3290: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
32a0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
32b0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
32c0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
32d0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
32e0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
32f0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3300: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3310: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3320: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3330: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
3340: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
3350: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
3360: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
3370: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
3380: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
3390: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
33a0: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
33b0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
33c0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
33d0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
33e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
33f0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3400: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3410: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3430: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
3440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
3450: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3460: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
3470: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
3480: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
3490: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
34a0: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
34b0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
34c0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
34d0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
34e0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
34f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3500: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3510: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3520: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3530: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
3540: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3550: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
3560: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
3570: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
3580: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
3590: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
35a0: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
35b0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
35c0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
35d0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
35e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
35f0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3600: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3610: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3620: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3630: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
3640: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
3650: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
3660: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
3670: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
3680: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3690: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
36a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
36b0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
36c0: 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52  UAL );  /* EV: R
36d0: 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a  -00211-15100 */.
36e0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
36f0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3700: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3710: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3720: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3730: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3740: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3750: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3760: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3770: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3780: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3790: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
37a0: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
37b0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
37c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
37e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3800: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3810: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3820: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3830: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3840: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3850: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3860: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3880: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3890: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
38a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38b0: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
38c0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
38d0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
38e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
38f0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3900: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3910: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3920: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3930: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3940: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3950: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3960: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3980: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3990: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
39a0: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
39b0: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
39c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
39d0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
39e0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
39f0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3a00: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3a10: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3a20: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3a30: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3a40: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3a50: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3a60: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3a70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3a80: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3a90: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3aa0: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3ab0: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
3ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
3ad0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3ae0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3af0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3b00: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3b10: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3b20: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3b40: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3b50: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3b60: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3b70: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3b90: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3ba0: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3bb0: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
3bc0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
3bd0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
3be0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3bf0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3c00: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3c10: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3c20: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3c30: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3c40: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3c50: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3c60: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3c70: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3c80: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3c90: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3ca0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3cc0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3cd0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ce0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3cf0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3d00: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3d10: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3d20: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3d40: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3d50: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3d60: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3d70: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3d80: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3d90: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3da0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3db0: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3dc0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3dd0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3de0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3df0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3e00: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3e10: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3e20: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3e30: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3e40: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3e50: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3e60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3e70: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3e80: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3e90: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3ea0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3eb0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ec0: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
3ed0: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
3ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
3ef0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
3f00: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
3f10: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
3f20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3f30: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
3f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3f50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3f60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
3f70: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
3f80: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
3f90: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
3fa0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
3fb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
3fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3fd0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3fe0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
3ff0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
4000: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
4010: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4020: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
4030: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
4040: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
4050: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
4060: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
4070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
4080: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
4090: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
40a0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
40b0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
40c0: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
40d0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
40e0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
40f0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
4100: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
4110: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4120: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
4130: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
4140: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
4150: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
4160: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
4170: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
4180: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
4190: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
41a0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
41b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
41c0: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
41d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
41e0: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
41f0: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
4200: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
4210: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
4220: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
4230: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
4240: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
4250: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
4260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
4270: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52  .** The sqlite3R
4280: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4290: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
42a0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
42b0: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
42c0: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
42d0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
42e0: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
42f0: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
4300: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
4310: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
4320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
4330: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
4340: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
4350: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
4360: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
4370: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
4380: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
4390: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
43a0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
43b0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
43c0: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
43d0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
43e0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
43f0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4400: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
4410: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4420: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
4430: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4440: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
4450: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
4460: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
4470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4480: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4490: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
44a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
44b0: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
44c0: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
44d0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
44e0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44f0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
4500: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
4510: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4520: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
4530: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4540: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4550: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
4560: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
4570: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4580: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
4590: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
45a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
45b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
45c0: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
45d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
45e0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
45f0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4600: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4610: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4620: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4630: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
4640: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4650: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
4660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4680: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
4690: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46a0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
46b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
46d0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
46e0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
46f0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
4700: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4710: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
4720: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4730: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
4740: 53 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  S ){.    mask |=
4750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
4760: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4770: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d  ->pEList);.    m
4780: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
4790: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
47a0: 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79  et, pS->pGroupBy
47b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
47c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
47d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
47e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d  pOrderBy);.    m
47f0: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4800: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4810: 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  pS->pWhere);.   
4820: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
4830: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4840: 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  , pS->pHaving);.
4850: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4860: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4870: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4880: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4890: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
48a0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
48b0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
48c0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
48d0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
48e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
48f0: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4900: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4910: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4920: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4930: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4940: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4950: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4960: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4970: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4980: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
49a0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
49b0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
49c0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
49d0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
49e0: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
49f0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4a00: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4a10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4a20: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a30: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4a40: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4a50: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4a60: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4a70: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4a80: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4a90: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4aa0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4ab0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4ad0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4ae0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4af0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4b00: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b10: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4b20: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4b30: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4b40: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4b50: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4b60: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4b70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4b80: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4b90: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ba0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4bb0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4bc0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4bd0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4be0: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4bf0: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4c00: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4c10: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4c20: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4c30: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4c40: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4c50: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4c60: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4c70: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4c80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4c90: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4ca0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4cb0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4cc0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4cd0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
4ce0: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
4cf0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
4d00: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
4d10: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
4d20: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
4d30: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
4d40: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
4d50: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
4d60: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
4d70: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
4d80: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
4d90: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
4da0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
4db0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
4dc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
4dd0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
4de0: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
4df0: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
4e00: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
4e10: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
4e20: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
4e30: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
4e40: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4e50: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4e60: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
4e70: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
4e80: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
4e90: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
4ea0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
4eb0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
4ec0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
4ed0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
4ee0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
4ef0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
4f00: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
4f10: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
4f20: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
4f30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4f40: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
4f50: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
4f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4f70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
4f90: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
4fa0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
4fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
4fc0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
4fd0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
4fe0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4ff0: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5000: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5010: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5020: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5030: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5040: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5050: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5060: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5070: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
5080: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
5090: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
50a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
50b0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
50c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
50d0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
50e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
50f0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5100: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5110: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5120: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5130: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5140: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5150: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5160: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5170: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
5180: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
5190: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
51a0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
51b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
51c0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
51d0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
51e0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
51f0: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5200: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5210: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5220: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5230: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5240: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5250: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5260: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5270: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
5280: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
5290: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
52a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
52b0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
52c0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
52d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
52e0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
52f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5300: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5310: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5320: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5330: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5340: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5350: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5360: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5370: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
5380: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5390: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
53a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
53c0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
53d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
53e0: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
53f0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5400: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5410: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5420: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5430: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5440: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5450: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5460: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5470: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
5480: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
5490: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
54a0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
54b0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
54c0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
54d0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
54e0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
54f0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5500: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5510: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5520: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5530: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5540: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5550: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5570: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
5580: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
5590: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
55a0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
55b0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
55c0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55e0: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
55f0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5600: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5610: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5620: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5630: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5640: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5650: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5660: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5670: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
5680: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
5690: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
56a0: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
56b0: 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
56c0: 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
56d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
56e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
56f0: 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  ur.       && (pT
5700: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
5710: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
5720: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
5730: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
5740: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26  Column.       &&
5750: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
5760: 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20  or & op)!=0.    
5770: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
5780: 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  x && pTerm->eOpe
5790: 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c  rator!=WO_ISNULL
57a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
57b0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
57c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  xpr;.        Col
57d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
57e0: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
57f0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
5800: 0a 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a  .        Parse *
5810: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
5820: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  arse;..        i
5830: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
5840: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
5850: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
5860: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
5870: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
5880: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
5890: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
58a0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
58b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
58c0: 65 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64  equence required
58d0: 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66   from an index f
58e0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  or.        ** it
58f0: 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f   to be useful fo
5900: 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70  r optimising exp
5910: 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72  ression pX. Stor
5920: 65 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  e this.        *
5930: 2a 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61  * value in varia
5940: 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20  ble pColl..     
5950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
5960: 73 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b  sert(pX->pLeft);
5970: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
5980: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
5990: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
59a0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
59b0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
59c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c       assert(pCol
59d0: 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  l || pParse->nEr
59e0: 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  r);..        for
59f0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
5a00: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
5a10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5a20: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
5a30: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
5a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5a50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5a60: 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  pColl && sqlite3
5a70: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
5a80: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
5a90: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
5aa0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5ab0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
5ac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5ad0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
5ae0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5af0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5b00: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
5b10: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
5b20: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
5b30: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
5b40: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
5b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
5b60: 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  **.**.*/.static 
5b70: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5b80: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
5b90: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
5ba0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
5bb0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
5bc0: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
5bd0: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
5be0: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
5bf0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
5c10: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
5c20: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
5c30: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
5c40: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
5c50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5c60: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
5c70: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
5c80: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
5c90: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
5ca0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
5cb0: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
5cc0: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
5cd0: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
5ce0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
5cf0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
5d00: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
5d10: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
5d20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
5d30: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
5d40: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
5d50: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
5d60: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
5d70: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
5d80: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
5d90: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
5db0: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
5dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
5dd0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5de0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5df0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
5e00: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
5e10: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
5e20: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
5e30: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
5e40: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
5e50: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
5e60: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
5e70: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
5e80: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
5e90: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
5ea0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
5eb0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
5ec0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
5ed0: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
5ee0: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
5ef0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
5f00: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
5f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
5f20: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
5f30: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
5f40: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5f50: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
5f60: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
5f70: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
5f80: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
5f90: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
5fa0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
5fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5fc0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
5fd0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
5fe0: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6000: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
6010: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
6020: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
6030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6040: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
6050: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
6060: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
6070: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
6080: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
6090: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
60a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
60b0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
60c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
60d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
60e0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
60f0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
6100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
6110: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
6120: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
6130: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
6140: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
6150: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
6160: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
6170: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
6180: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
6190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
61a0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
61b0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
61c0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
61d0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
61e0: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
61f0: 4f 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33  OLUMN || sqlite3
6200: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
6210: 66 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ft)!=SQLITE_AFF_
6220: 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  TEXT ){.    /* I
6230: 4d 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36  MP: R-02065-4946
6240: 35 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  5 The left-hand 
6250: 73 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45  side of the LIKE
6260: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
6270: 72 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  r must.    ** be
6280: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
6290: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77  indexed column w
62a0: 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74  ith TEXT affinit
62b0: 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
62c0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
62d0: 28 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ( pLeft->iColumn
62e0: 21 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63  !=(-1) ); /* Bec
62f0: 61 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68  ause IPK never h
6300: 61 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a  as AFF_TEXT */..
6310: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
6320: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6330: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
6340: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
6350: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
6360: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
6370: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
6380: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
6390: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
63a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
63b0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
63c0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
63d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
63e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
63f0: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
6400: 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  e, iCol, SQLITE_
6410: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69  AFF_NONE);.    i
6420: 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74  f( pVal && sqlit
6430: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
6440: 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  al)==SQLITE_TEXT
6450: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   ){.      z = (c
6460: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
6480: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6490: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
64a0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
64b0: 43 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  Col); /* IMP: R-
64c0: 32 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20  23257-02778 */. 
64d0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
64e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
64f0: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
6500: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
6510: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
6520: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
6530: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
6540: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
6550: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
6560: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
6570: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
6580: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
6590: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
65a0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
65b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
65c0: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
65d0: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
65e0: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
65f0: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
6600: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
6610: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
6620: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
6630: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
6640: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
6650: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
6660: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
6670: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
6680: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
6690: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
66a0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
66b0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
66c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
66d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
66e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
66f0: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
6700: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f 2a 20 49  ->iColumn); /* I
6710: 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37  MP: R-23257-0277
6720: 38 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  8 */.        if(
6730: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26   *pisComplete &&
6740: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
6750: 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[1] ){.        
6760: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20    /* If the rhs 
6770: 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72  of the LIKE expr
6780: 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69  ession is a vari
6790: 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75  able, and the cu
67a0: 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  rrent.          
67b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
67c0: 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74  variable means t
67d0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
67e0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49  to invoke the LI
67f0: 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  KE.          ** 
6800: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e  function, then n
6810: 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69  o OP_Variable wi
6820: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
6830: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  he program..    
6840: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
6850: 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f  uses problems fo
6860: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  r the sqlite3_bi
6870: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
6880: 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
6890: 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f   API. To workaro
68a0: 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20  und them, add a 
68b0: 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c  dummy OP_Variabl
68c0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  e here..        
68d0: 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
68e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
68f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6900: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
6910: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
6920: 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67  get(pParse, pRig
6930: 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ht, r1);.       
6940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6950: 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65  angeP3(v, sqlite
6960: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6970: 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  (v)-1, 0);.     
6980: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6990: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
69a0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
69b0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
69c0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30  lse{.      z = 0
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
69e0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
69f0: 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
6a00: 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  (z!=0);.}.#endif
6a10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6a20: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
6a30: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
6a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6a50: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
6a60: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
6a70: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6a80: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6a90: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
6aa0: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
6ab0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
6ac0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
6ad0: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
6ae0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
6af0: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
6b00: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
6b10: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
6b20: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
6b30: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
6b40: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
6b50: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
6b60: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
6b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6b90: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
6ba0: 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30  oken,"match")!=0
6bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6bc0: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
6bd0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
6be0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
6bf0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
6c00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6c10: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
6c20: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
6c30: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
6c40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6c50: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
6c60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
6c70: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
6c80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
6c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
6ca0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
6cb0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6cc0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
6cd0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
6ce0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
6cf0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
6d00: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
6d10: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
6d20: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
6d30: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
6d40: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
6d50: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
6d60: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
6d70: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
6d80: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
6d90: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
6da0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
6db0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
6dc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
6dd0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
6de0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6df0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
6e00: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74  *.** Analyze a t
6e10: 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74  erm that consist
6e20: 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s of two or more
6e30: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a   OR-connected.**
6e40: 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69   subterms.  So i
6e50: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  n:.**.**     ...
6e60: 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e   WHERE  (a=5) AN
6e70: 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52  D (b=7 OR c=9 OR
6e80: 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33   d=13) AND (d=13
6e90: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e                ^^
6eb0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6ec0: 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ^^.**.** This ro
6ed0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
6ee0: 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65  erms such as the
6ef0: 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20   middle term in 
6f00: 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c  the above exampl
6f10: 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54  e..** A WhereOrT
6f20: 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  erm object is co
6f30: 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63  mputed and attac
6f40: 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20  hed to the term 
6f50: 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69  under.** analysi
6f60: 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  s, regardless of
6f70: 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20   the outcome of 
6f80: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48  the analysis.  H
6f90: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ence:.**.**     
6fa0: 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67  WhereTerm.wtFlag
6fb0: 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49  s   |=  TERM_ORI
6fc0: 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  NFO.**     Where
6fd0: 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20  Term.u.pOrInfo  
6fe0: 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  =  a dynamically
6ff0: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
7000: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a  OrTerm object.**
7010: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69  .** The term bei
7020: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74  ng analyzed must
7030: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
7040: 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  e of OR-connecte
7050: 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41  d subterms..** A
7060: 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20   single subterm 
7070: 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f  might be a set o
7080: 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  f AND-connected 
7090: 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a  sub-subterms..**
70a0: 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72   Examples of ter
70b0: 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  ms under analysi
70c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29  s:.**.**     (A)
70d0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
70e0: 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74  R t1.x=t2.z OR t
70f0: 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74  1.y=15 OR t1.z=t
7100: 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29  3.a+5.**     (B)
7110: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
7120: 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70  expr2=x OR x=exp
7130: 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20  r3.**     (C)   
7140: 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28    t1.x=t2.y OR (
7150: 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31  t1.x=t2.z AND t1
7160: 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44  .y=15).**     (D
7170: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
7180: 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20   (y>11 AND y<22 
7190: 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c  AND z LIKE '*hel
71a0: 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29  lo*').**     (E)
71b0: 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20       (p.a=1 AND 
71c0: 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29  q.b=2 AND r.c=3)
71d0: 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71   OR (p.x=4 AND q
71e0: 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a  .y=5 AND r.z=6).
71f0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a  **.** CASE 1:.**
7200: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65  .** If all subte
7210: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
7220: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72  orm T.C=expr for
7230: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c   some single col
7240: 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69  umn of C.** a si
7250: 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73  ngle table T (as
7260: 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c   shown in exampl
7270: 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20  e B above) then 
7280: 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
7290: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61  tual.** term tha
72a0: 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65  t is an equivale
72b0: 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  nt IN expression
72c0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
72d0: 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a  s, if the term.*
72e0: 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  * being analyzed
72f0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   is:.**.**      
7300: 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65  x = expr1  OR  e
7310: 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20  xpr2 = x  OR  x 
7320: 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68  = expr3.**.** th
7330: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7340: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b  virtual term lik
7350: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
7360: 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65     x IN (expr1,e
7370: 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a  xpr2,expr3).**.*
7380: 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20  * CASE 2:.**.** 
7390: 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20  If all subterms 
73a0: 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79  are indexable by
73b0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
73c0: 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a  T, then set.**.*
73d0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
73e0: 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20  eOperator       
73f0: 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a         =  WO_OR.
7400: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
7410: 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .u.pOrInfo->inde
7420: 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63  xable  |=  the c
7430: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7440: 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41   table T.**.** A
7450: 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64   subterm is "ind
7460: 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73  exable" if it is
7470: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
7480: 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  "T.C <op> <expr>
7490: 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79  " where C is any
74a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
74b0: 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20   T and .** <op> 
74c0: 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22  is one of "=", "
74d0: 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22  <", "<=", ">", "
74e0: 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20  >=", "IS NULL", 
74f0: 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75  or "IN"..** A su
7500: 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e  bterm is also in
7510: 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73  dexable if it is
7520: 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f   an AND of two o
7530: 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62  r more.** subsub
7540: 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f  terms at least o
7550: 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69  ne of which is i
7560: 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78  ndexable.  Index
7570: 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62  able AND .** sub
7580: 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72  terms have their
7590: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
75a0: 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65  o WO_AND and the
75b0: 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64  y have.** u.pAnd
75c0: 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79  Info set to a dy
75d0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
75e0: 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d  ted WhereAndTerm
75f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46   object..**.** F
7600: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e  rom another poin
7610: 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65  t of view, "inde
7620: 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61  xable" means tha
7630: 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f  t the subterm co
7640: 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  uld.** potential
7650: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
7660: 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61  an index if an a
7670: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
7680: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73   exists..** This
7690: 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e   analysis does n
76a0: 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74  ot consider whet
76b0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69  her or not the i
76c0: 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61  ndex exists; tha
76d0: 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e  t.** is somethin
76e0: 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28  g the bestIndex(
76f0: 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
7700: 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20  etermine.  This 
7710: 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79  analysis.** only
7720: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
7730: 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f  r subterms appro
7740: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7750: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7760: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7770: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7780: 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65  all satisfy case
7790: 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65   2.  But if a te
77a0: 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69  rm.** also stati
77b0: 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75  sfies case 1 (su
77c0: 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77  ch as B) we know
77d0: 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
77e0: 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61  zer will.** alwa
77f0: 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31  ys prefer case 1
7800: 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73  , so in that cas
7810: 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61  e we pretend tha
7820: 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a  t case 2 is not.
7830: 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a  ** satisfied..**
7840: 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20  .** It might be 
7850: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75  the case that mu
7860: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72  ltiple tables ar
7870: 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f  e indexable.  Fo
7880: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45  r example,.** (E
7890: 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78  ) above is index
78a0: 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50  able on tables P
78b0: 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a  , Q, and R..**.*
78c0: 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74  * Terms that sat
78d0: 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20  isfy case 2 are 
78e0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c  candidates for l
78f0: 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a  ookup by using.*
7900: 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  * separate indic
7910: 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64  es to find rowid
7920: 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65  s for each subte
7930: 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67  rm and composing
7940: 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  .** the union of
7950: 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e   all rowids usin
7960: 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  g a RowSet objec
7970: 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  t.  This is simi
7980: 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61  lar.** to "bitma
7990: 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74  p indices" in ot
79a0: 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67  her database eng
79b0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45  ines..**.** OTHE
79c0: 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20  RWISE:.**.** If 
79d0: 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e  neither case 1 n
79e0: 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c  or case 2 apply,
79f0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20   then leave the 
7a00: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7a10: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20  .** zero.  This 
7a20: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66  term is not usef
7a30: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a  ul for search..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
7a50: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
7a60: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
7a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7a80: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7a90: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
7aa0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
7ab0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57  * the complete W
7ac0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
7ad0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
7ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7af0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65  dex of the OR-te
7b00: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
7b10: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
7b20: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
7b30: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
7b40: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
7b50: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
7b60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7b70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7b80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7b90: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65  nection */.  Whe
7ba0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
7bb0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7bc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
7bd0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
7be0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7bf0: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
7c20: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20  f the term */.  
7c30: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
7c40: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
7c50: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65  askSet; /* Table
7c60: 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20   use masks */.  
7c70: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7ca0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
7cb0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
7cc0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b  ;       /* Break
7cd0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f  up of pTerm into
7ce0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57   subterms */.  W
7cf0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
7d00: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75  m;       /* A Su
7d10: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  b-term within th
7d20: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65  e pOrWc */.  Whe
7d30: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66  reOrInfo *pOrInf
7d40: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69  o;     /* Additi
7d50: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7d60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7d70: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d   pTerm */.  Bitm
7d80: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20  ask chngToIN;   
7d90: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
7da0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
7db0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42  fy case 1 */.  B
7dc0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65  itmask indexable
7dd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ;        /* Tabl
7de0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65  es that are inde
7df0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e  xable, satisfyin
7e00: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f  g case 2 */..  /
7e10: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65  *.  ** Break the
7e20: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20   OR clause into 
7e30: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62  its separate sub
7e40: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74  terms.  The subt
7e50: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74  erms are.  ** st
7e60: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43  ored in a WhereC
7e70: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20  lause structure 
7e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69  containing withi
7e90: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66  n the WhereOrInf
7ea0: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68  o.  ** object th
7eb0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
7ec0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  o the original O
7ed0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20  R clause term.. 
7ee0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
7ef0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
7f00: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  (TERM_DYNAMIC|TE
7f10: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41  RM_ORINFO|TERM_A
7f20: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20  NDINFO))==0 );. 
7f30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7f40: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70  op==TK_OR );.  p
7f50: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20  Term->u.pOrInfo 
7f60: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69  = pOrInfo = sqli
7f70: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7f80: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49  db, sizeof(*pOrI
7f90: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72  nfo));.  if( pOr
7fa0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
7fb0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  ;.  pTerm->wtFla
7fc0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46  gs |= TERM_ORINF
7fd0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f  O;.  pOrWc = &pO
7fe0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65  rInfo->wc;.  whe
7ff0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72  reClauseInit(pOr
8000: 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c  Wc, pWC->pParse,
8010: 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68   pMaskSet);.  wh
8020: 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20  ereSplit(pOrWc, 
8030: 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20  pExpr, TK_OR);. 
8040: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
8050: 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20  pSrc, pOrWc);.  
8060: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
8070: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
8080: 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e   assert( pOrWc->
8090: 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f  nTerm>=2 );..  /
80a0: 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74  *.  ** Compute t
80b0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
80c0: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
80d0: 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32  sfy cases 1 or 2
80e0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62  ..  */.  indexab
80f0: 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  le = ~(Bitmask)0
8100: 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e  ;.  chngToIN = ~
8110: 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20  (pWC->vmask);.  
8120: 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65  for(i=pOrWc->nTe
8130: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f  rm-1, pOrTerm=pO
8140: 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20  rWc->a; i>=0 && 
8150: 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20  indexable; i--, 
8160: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
8170: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f  if( (pOrTerm->eO
8180: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
8190: 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  GLE)==0 ){.     
81a0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
81b0: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  AndInfo;.      a
81c0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
81d0: 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a  eOperator==0 );.
81e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
81f0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8200: 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c  & (TERM_ANDINFO|
8210: 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30  TERM_ORINFO))==0
8220: 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f   );.      chngTo
8230: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41  IN = 0;.      pA
8240: 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  ndInfo = sqlite3
8250: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8260: 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f  sizeof(*pAndInfo
8270: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  ));.      if( pA
8280: 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  ndInfo ){.      
8290: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
82a0: 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57  AndWC;.        W
82b0: 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65  hereTerm *pAndTe
82c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
82d0: 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  j;.        Bitma
82e0: 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  sk b = 0;.      
82f0: 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e    pOrTerm->u.pAn
8300: 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f  dInfo = pAndInfo
8310: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
8320: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
8330: 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20  RM_ANDINFO;.    
8340: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70      pOrTerm->eOp
8350: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b  erator = WO_AND;
8360: 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20  .        pAndWC 
8370: 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  = &pAndInfo->wc;
8380: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c  .        whereCl
8390: 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c  auseInit(pAndWC,
83a0: 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d   pWC->pParse, pM
83b0: 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20  askSet);.       
83c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64   whereSplit(pAnd
83d0: 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  WC, pOrTerm->pEx
83e0: 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  pr, TK_AND);.   
83f0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
8400: 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43  All(pSrc, pAndWC
8410: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
8420: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
8430: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8440: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8450: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8460: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
8470: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
8480: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
8490: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
84a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
84b0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
84c0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
84d0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
84e0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
84f0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
8500: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
8510: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
8520: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8530: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8550: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8560: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8570: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8580: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8590: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
85a0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
85b0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
85c0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
85d0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
85e0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
85f0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8600: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8610: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8630: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8640: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
8650: 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  Set, pOrTerm->le
8660: 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  ftCursor);.     
8670: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74   if( pOrTerm->wt
8680: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
8690: 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  TUAL ){.        
86a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
86b0: 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f  r = &pOrWc->a[pO
86c0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  rTerm->iParent];
86d0: 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65  .        b |= ge
86e0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
86f0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73  pOther->leftCurs
8700: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
8710: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20     indexable &= 
8720: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  b;.      if( pOr
8730: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
8740: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
8750: 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a    chngToIN = 0;.
8760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8770: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d       chngToIN &=
8780: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8790: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
87a0: 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20   Record the set 
87b0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
87c0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
87d0: 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65  The set might be
87e0: 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a  .  ** empty..  *
87f0: 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  /.  pOrInfo->ind
8800: 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62  exable = indexab
8810: 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  le;.  pTerm->eOp
8820: 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62  erator = indexab
8830: 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f  le==0 ? 0 : WO_O
8840: 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68  R;..  /*.  ** ch
8850: 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73  ngToIN holds a s
8860: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8870: 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66  t *might* satisf
8880: 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20  y case 1.  But. 
8890: 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64   ** we have to d
88a0: 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  o some additiona
88b0: 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65  l checking to se
88c0: 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c  e if case 1 real
88d0: 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73  ly.  ** is satis
88e0: 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fied..  **.  ** 
88f0: 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f  chngToIN will ho
8900: 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20  ld either 0, 1, 
8910: 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20  or 2 bits.  The 
8920: 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73  0-bit case means
8930: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65  .  ** that there
8940: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
8950: 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  ty of transformi
8960: 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  ng the OR clause
8970: 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e   into an.  ** IN
8980: 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73   operator becaus
8990: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65  e one or more te
89a0: 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  rms in the OR cl
89b0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a  ause contain.  *
89c0: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  * something othe
89d0: 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63  r than == on a c
89e0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e  olumn in the sin
89f0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
8a00: 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20  1-bit.  ** case 
8a10: 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79  means that every
8a20: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20   term of the OR 
8a30: 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
8a40: 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c   form.  ** "tabl
8a50: 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66  e.column=expr" f
8a60: 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74  or some single t
8a70: 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62  able.  The one b
8a80: 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20  it that is set. 
8a90: 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70   ** will corresp
8aa0: 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f  ond to the commo
8ab0: 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69  n table.  We sti
8ac0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  ll need to check
8ad0: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75   to make.  ** su
8ae0: 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  re the same colu
8af0: 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c  mn is used on al
8b00: 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d  l terms.  The 2-
8b10: 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e  bit case is when
8b20: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65  .  ** the all te
8b30: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66  rms are of the f
8b40: 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75  orm "table1.colu
8b50: 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e  mn=table2.column
8b60: 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68  ".  It.  ** migh
8b70: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
8b80: 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72   form an IN oper
8b90: 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72  ator with either
8ba0: 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20   table1.column. 
8bb0: 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f   ** or table2.co
8bc0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20  lumn as the LHS 
8bd0: 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d  if either is com
8be0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
8bf0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52  m of.  ** the OR
8c00: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
8c10: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72  ** Note that ter
8c20: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
8c30: 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61  table.column1=ta
8c40: 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68  ble.column2" (th
8c50: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c  e.  ** same tabl
8c60: 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20  e on both sizes 
8c70: 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f  of the ==) canno
8c80: 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  t be optimized..
8c90: 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54    */.  if( chngT
8ca0: 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  oIN ){.    int o
8cb0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
8cc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8cd0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  the conversion t
8ce0: 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f  o IN is valid */
8cf0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  .    int iColumn
8d00: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
8d10: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  * Column index o
8d20: 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72  n lhs of IN oper
8d30: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ator */.    int 
8d40: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20  iCursor = -1;   
8d50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63        /* Table c
8d60: 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20  ursor common to 
8d70: 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  all terms */.   
8d80: 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20   int j = 0;     
8d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8da0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8db0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
8dc0: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c   a table and col
8dd0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
8de0: 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   on one side or 
8df0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
8e00: 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61   of the == opera
8e10: 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62  tor in every sub
8e20: 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c  term.  That tabl
8e30: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  e and column.   
8e40: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f   ** will be reco
8e50: 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20  rded in iCursor 
8e60: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68  and iColumn.  Th
8e70: 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ere might not be
8e80: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
8e90: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8ea0: 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67  n.  Set okToChng
8eb0: 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f  ToIN if an appro
8ec0: 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20  priate table.   
8ed0: 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69   ** and column i
8ee0: 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76  s found but leav
8ef0: 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66  e okToChngToIN f
8f00: 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e  alse if not foun
8f10: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
8f20: 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f  r(j=0; j<2 && !o
8f30: 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b  kToChngToIN; j++
8f40: 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d  ){.      pOrTerm
8f50: 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20   = pOrWc->a;.   
8f60: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
8f70: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
8f80: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fa0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8fb0: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20  or==WO_EQ );.   
8fc0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8fd0: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
8fe0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  R_OK;.        if
8ff0: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9000: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9020: 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74  his is the 2-bit
9030: 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65   case and we are
9040: 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   on the second i
9050: 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  teration and.   
9060: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
9070: 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74  t term is from t
9080: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
9090: 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69  on.  So skip thi
90a0: 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20  s term. */.     
90b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
90c0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
90d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
90e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
90f0: 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61  chngToIN & getMa
9100: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72  sk(pMaskSet, pOr
9110: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9120: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
9130: 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20     /* This term 
9140: 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  must be of the f
9150: 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77  orm t1.a==t2.b w
9160: 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68  here t2 is in th
9170: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  e.          ** c
9180: 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20  hngToIN set but 
9190: 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73  t1 is not.  This
91a0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69   term will be ei
91b0: 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20  ther preceeded. 
91c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
91d0: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
91e0: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
91f0: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9200: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9210: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9220: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9230: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9240: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
9250: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9260: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9270: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9280: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9290: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
92a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
92b0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
92c0: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
92d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
92e0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
92f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9300: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9310: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9320: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9330: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9340: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
9350: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9360: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9370: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9380: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9390: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
93a0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
93b0: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
93c0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
93d0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
93e0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
93f0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9400: 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54    assert( (chngT
9410: 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29  oIN&(chngToIN-1)
9420: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
9430: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
9440: 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  ==getMask(pMaskS
9450: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
9460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
9480: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
9490: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
94a0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
94b0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
94c0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
94d0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
94e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
94f0: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
9500: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
9510: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
9520: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
9530: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
9540: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
9550: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
9560: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9570: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9580: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
9590: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
95a0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
95b0: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
95c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
95d0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
95e0: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
95f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9600: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9610: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
9620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b   ){.          ok
9630: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9650: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66           int aff
9660: 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a  Left, affRight;.
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9680: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
9690: 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f  ide is also a co
96a0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61  lumn, then the a
96b0: 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20  ffinities.      
96c0: 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72      ** of both r
96d0: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
96e0: 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68  des must be such
96f0: 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20   that no type.  
9700: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65          ** conve
9710: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
9720: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
9730: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
9740: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ).          */. 
9750: 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68           affRigh
9760: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
9770: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
9780: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  >pExpr->pRight);
9790: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65  .          affLe
97a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
97b0: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
97c0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
97d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
97e0: 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66  ffRight!=0 && af
97f0: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
9800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
9810: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9820: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
9830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  {.            pO
9840: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
9850: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
9860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9870: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9880: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
9890: 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e  s point, okToChn
98a0: 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66  gToIN is true if
98b0: 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20   original pTerm 
98c0: 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a  satisfies.    **
98d0: 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61   case 1.  In tha
98e0: 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63  t case, construc
98f0: 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  t a new virtual 
9900: 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20  term that is .  
9910: 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65    ** pTerm conve
9920: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20  rted into an IN 
9930: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a  operator..    **
9940: 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30  .    ** EV: R-00
9950: 32 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f  211-15100.    */
9960: 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e  .    if( okToChn
9970: 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45  gToIN ){.      E
9980: 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20  xpr *pDup;      
9990: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73        /* A trans
99a0: 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65  ient duplicate e
99b0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
99c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
99d0: 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  st = 0;   /* The
99e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
99f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9a00: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
9a10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;       /* The L
9a20: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
9a30: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45  rator */.      E
9a40: 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  xpr *pNew;      
9a50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
9a60: 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f  plete IN operato
9a70: 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  r */..      for(
9a80: 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  i=pOrWc->nTerm-1
9a90: 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d  , pOrTerm=pOrWc-
9aa0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  >a; i>=0; i--, p
9ab0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9ac0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
9ad0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9ae0: 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74  OR_OK)==0 ) cont
9af0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
9b00: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
9b10: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20  Operator==WO_EQ 
9b20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b30: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  t( pOrTerm->left
9b40: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
9b50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9b60: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  t( pOrTerm->u.le
9b70: 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  ftColumn==iColum
9b80: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75  n );.        pDu
9b90: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
9ba0: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
9bb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
9bc0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
9bd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9be0: 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50  stAppend(pWC->pP
9bf0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75  arse, pList, pDu
9c00: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  p);.        pLef
9c10: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
9c20: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9c30: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c40: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
9c50: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
9c60: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
9c70: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  ft, 0);.      pN
9c80: 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
9c90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9ca0: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
9cb0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
9cc0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
9cd0: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
9ce0: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
9cf0: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
9d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9d10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9d20: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
9d30: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ct) );.        p
9d40: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
9d50: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
9d60: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
9d70: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
9d80: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
9d90: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
9da0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9db0: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
9dc0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
9dd0: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
9de0: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
9df0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
9e00: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
9e10: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
9e20: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
9e30: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
9e40: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
9e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
9e70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
9e80: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9e90: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
9ea0: 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20  tor = WO_NOOP;  
9eb0: 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73  /* case 1 trumps
9ec0: 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d   case 2 */.    }
9ed0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9ee0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
9ef0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
9f00: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
9f10: 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  BQUERY */.../*.*
9f20: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
9f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9f40: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
9f50: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
9f60: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
9f70: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
9f80: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
9f90: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
9fa0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
9fb0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
9fc0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
9fd0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9fe0: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
9ff0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
a000: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a010: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
a020: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
a030: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
a040: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
a050: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
a060: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
a070: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
a080: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
a090: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
a0a0: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
a0b0: 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c  and Y are.** col
a0c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f  umns, then the o
a0d0: 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69  riginal expressi
a0e0: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
a0f0: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
a100: 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65  l.** term of the
a110: 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22   form "Y <op> X"
a120: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
a140: 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65  d.** analyzed se
a150: 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f  parately.  The o
a160: 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20  riginal term is 
a170: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
a180: 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74  _COPIED.** and t
a190: 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d  he new term is m
a1a0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
a1b0: 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65  DYNAMIC (because
a1c0: 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e   it's pExpr.** n
a1d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
a1e0: 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43   with the WhereC
a1f0: 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f  lause) and TERM_
a200: 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65  VIRTUAL (because
a210: 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d   it.** is a comm
a220: 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70  uted copy of a p
a230: 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65  rior term.)  The
a240: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68   original term h
a250: 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61  as nChild=1.** a
a260: 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20  nd the copy has 
a270: 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f  idxParent set to
a280: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
a290: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
a2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a2b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
a2c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
a2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
a2e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a2f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a300: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
a310: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a320: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
a350: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
a360: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
a370: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
a380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a390: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
a3a0: 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lyzed */.  Where
a3b0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
a3c0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
a3d0: 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65  et of table inde
a3e0: 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70  x masks */.  Exp
a3f0: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a410: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a420: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
a430: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
a440: 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  eqLeft;         
a450: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
a460: 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78  sites of the pEx
a470: 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42  pr->pLeft */.  B
a480: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
a490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a4a0: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
a4b0: 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42   of pExpr */.  B
a4c0: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
a4d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
a4e0: 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65  /* Extra depende
a4f0: 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f  ncies on LEFT JO
a500: 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53  IN */.  Expr *pS
a510: 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tr1 = 0;        
a520: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
a530: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
a540: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
a550: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20  sComplete = 0;  
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a570: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a580: 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61  ends with wildca
a590: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61  rd */.  int noCa
a5a0: 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
a5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45           /* LIKE
a5c0: 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73  /GLOB distinguis
a5d0: 68 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e  hes case */.  in
a5e0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a600: 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72  * Top-level oper
a610: 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70  ator.  pExpr->op
a620: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
a630: 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73  rse = pWC->pPars
a640: 65 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e;     /* Parsin
a650: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
a660: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a670: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
a680: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a690: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
a6a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a6b0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
a6c0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26  .  }.  pTerm = &
a6d0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
a6e0: 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  .  pMaskSet = pW
a6f0: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70  C->pMaskSet;.  p
a700: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
a710: 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66  xpr;.  prereqLef
a720: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
a730: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
a740: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70  pr->pLeft);.  op
a750: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
a760: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
a770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
a780: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
a790: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
a7a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a7b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a7c0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
a7d0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
a7e0: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
a7f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a800: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
a810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a820: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
a830: 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c  t = exprListTabl
a840: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a850: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
a860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
a870: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
a880: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
a890: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
a8a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
a8b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a8c0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
a8d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a8e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
a8f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
a900: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
a910: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
a920: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a930: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
a940: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
a950: 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d  Bitmask x = getM
a960: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  ask(pMaskSet, pE
a970: 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
a980: 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65  able);.    prere
a990: 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65  qAll |= x;.    e
a9a0: 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b  xtraRight = x-1;
a9b0: 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74    /* ON clause t
a9c0: 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  erms may not be 
a9d0: 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64  used with an ind
a9e0: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
a9f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20            ** on 
aa00: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
aa10: 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b  LEFT JOIN.  Tick
aa20: 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a  et #3015 */.  }.
aa30: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
aa40: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
aa50: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
aa60: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
aa70: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
aa80: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
aa90: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
aaa0: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
aab0: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
aac0: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
aad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
aae0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
aaf0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
ab00: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
ab10: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
ab20: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
ab30: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
ab40: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
ab50: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
ab60: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
ab70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
ab80: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
ab90: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
aba0: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
abb0: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
abc0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
abd0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
abe0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
abf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
ac00: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
ac10: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
ac20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
ac30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
ac40: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
ac50: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
ac60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
ac70: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
ac80: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ac90: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
aca0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
acb0: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
acc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
acd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ace0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
acf0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
ad00: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
ad10: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ad20: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
ad30: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
ad40: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
ad50: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
ad60: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
ad70: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
ad80: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
ad90: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
ada0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
adb0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
adc0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
add0: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
ade0: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d  _COPIED;.      }
adf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
ae00: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
ae10: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
ae20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae30: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
ae40: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
ae50: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
ae60: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
ae70: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ae80: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
ae90: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74      pNew->u.left
aea0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
aeb0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74  iColumn;.      t
aec0: 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71  estcase( (prereq
aed0: 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68  Left | extraRigh
aee0: 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74  t) != prereqLeft
aef0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
af00: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72  prereqRight = pr
af10: 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61  ereqLeft | extra
af20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65  Right;.      pNe
af30: 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  w->prereqAll = p
af40: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20  rereqAll;.      
af50: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
af60: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70  = operatorMask(p
af70: 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a  Dup->op);.    }.
af80: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
afa0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
afb0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
afc0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
afd0: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
afe0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
aff0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
b000: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
b010: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
b020: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
b030: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
b040: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
b050: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
b060: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
b070: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
b080: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
b090: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
b0a0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
b0b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
b0c0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
b0d0: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
b0e0: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
b0f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
b100: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
b110: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
b120: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
b130: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b140: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
b150: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
b160: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
b170: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
b180: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
b190: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
b1a0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
b1b0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
b1c0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
b1d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
b1e0: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
b1f0: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
b200: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
b210: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
b220: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
b230: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
b240: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
b250: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
b260: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
b270: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
b280: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
b290: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
b2a0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
b2b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
b2c0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
b2d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
b2e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b2f0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
b300: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
b310: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
b320: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b330: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b360: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
b370: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
b3b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
b3c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b3d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b3e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b3f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
b400: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b410: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
b420: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
b430: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
b440: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
b450: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
b460: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b470: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
b480: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
b490: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
b4a0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
b4b0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
b4c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b4d0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
b4e0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
b4f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b500: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
b510: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
b520: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b530: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
b540: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74  Analyze a term t
b550: 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20  hat is composed 
b560: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
b570: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
b580: 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20  d by.  ** an OR 
b590: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
b5a0: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
b5b0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
b5c0: 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f    assert( pWC->o
b5d0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
b5e0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
b5f0: 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  rm(pSrc, pWC, id
b600: 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  xTerm);.    pTer
b610: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b620: 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  erm];.  }.#endif
b630: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b640: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
b650: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b660: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
b670: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
b680: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
b690: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
b6a0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
b6b0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
b6c0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
b6d0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
b6e0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
b6f0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
b700: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
b710: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
b720: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
b730: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
b740: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
b750: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
b760: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
b770: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
b780: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
b790: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
b7a0: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
b7b0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
b7c0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
b7d0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a  WC->op==TK_AND .
b7e0: 20 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c     && isLikeOrGl
b7f0: 6f 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ob(pParse, pExpr
b800: 2c 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d  , &pStr1, &isCom
b810: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
b820: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70    ){.    Expr *p
b830: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Left;       /* L
b840: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
b850: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
b860: 45 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20  Expr *pStr2;    
b870: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53     /* Copy of pS
b880: 74 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b  tr1 - RHS of LIK
b890: 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  E/GLOB operator 
b8a0: 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  */.    Expr *pNe
b8b0: 77 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72  wExpr1;.    Expr
b8c0: 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20   *pNewExpr2;.   
b8d0: 20 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20   int idxNew1;.  
b8e0: 20 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20    int idxNew2;. 
b8f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b900: 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  l;    /* Collati
b910: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75  ng sequence to u
b920: 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  se */..    pLeft
b930: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b940: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
b950: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
b960: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
b970: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
b980: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
b990: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b9a0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b9b0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b9c0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b9d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b9e0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b9f0: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
ba00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
ba10: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
ba20: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
ba30: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
ba40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
ba50: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
ba60: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
ba70: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
ba80: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
ba90: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
baa0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
bab0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
bac0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
bad0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
bae0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
baf0: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
bb00: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
bb10: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
bb20: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
bb30: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
bb40: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
bb50: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
bb60: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
bb70: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
bb80: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
bb90: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
bba0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
bbb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bbc0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
bbd0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
bbe0: 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33  ;   /* EV: R-643
bbf0: 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20  39-08207 */...  
bc00: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
bc10: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
bc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc30: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
bc40: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73   }.    pColl = s
bc50: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bc60: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
bc70: 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43  8, noCase ? "NOC
bc80: 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c  ASE" : "BINARY",
bc90: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
bca0: 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  1 = sqlite3PExpr
bcb0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20  (pParse, TK_GE, 
bcc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bce0: 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33  rSetColl(sqlite3
bcf0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
bd00: 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20  ,0), pColl),.   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20    pStr1, 0);.   
bd30: 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
bd40: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
bd50: 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
bd60: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
bd70: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
bd80: 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
bd90: 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
bda0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
bdb0: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
bdc0: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
bdd0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
bde0: 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_LT,.          
bdf0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
be00: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
be10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
be20: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
be30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be40: 20 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29         pStr2, 0)
be50: 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20  ;.    idxNew2 = 
be60: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
be70: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32  t(pWC, pNewExpr2
be80: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be90: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
bea0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
beb0: 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew2==0 );.    ex
bec0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
bed0: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
bee0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bef0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
bf00: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
bf10: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
bf20: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
bf30: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
bf40: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
bf50: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
bf60: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
bf70: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
bf80: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
bf90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
bfa0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
bfb0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
bfc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bfd0: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
bfe0: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
bff0: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
c000: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
c010: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
c020: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
c030: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
c040: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
c050: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
c060: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
c070: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
c080: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
c090: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
c0a0: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
c0b0: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
c0c0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
c0d0: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
c0e0: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
c0f0: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
c100: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
c110: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
c120: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
c130: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
c140: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
c150: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
c160: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
c170: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
c180: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
c190: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
c1a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c1b0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
c1c0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
c1d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72  .pExpr;.    prer
c1e0: 65 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62  eqExpr = exprTab
c1f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
c200: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70  , pRight);.    p
c210: 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78  rereqColumn = ex
c220: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c230: 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20  skSet, pLeft);. 
c240: 20 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78     if( (prereqEx
c250: 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d  pr & prereqColum
c260: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  n)==0 ){.      E
c270: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
c280: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
c290: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c2a0: 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a  rse, TK_MATCH, .
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
c2d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c2e0: 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20  db, pRight, 0), 
c2f0: 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77  0);.      idxNew
c300: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c310: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c320: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  pr, TERM_VIRTUAL
c330: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
c340: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c350: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
c360: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
c370: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
c380: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
c390: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
c3a0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
c3b0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
c3c0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
c3d0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
c3e0: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
c3f0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
c400: 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  mn;.      pNewTe
c410: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
c420: 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  WO_MATCH;.      
c430: 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e  pNewTerm->iParen
c440: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
c450: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
c460: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
c470: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
c480: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72   = 1;.      pTer
c490: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
c4a0: 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20  RM_COPIED;.     
c4b0: 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65   pNewTerm->prere
c4c0: 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72  qAll = pTerm->pr
c4d0: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ereqAll;.    }. 
c4e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c4f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c500: 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
c510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c520: 54 41 54 32 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT2.  /* When s
c530: 71 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74  qlite_stat2 hist
c540: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
c550: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
c560: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
c570: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
c580: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
c590: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
c5a0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
c5b0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
c5c0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
c5d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c5e0: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
c5f0: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
c600: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
c610: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
c620: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
c630: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
c640: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
c650: 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73  ERM_VNULL.  This
c660: 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c  .  ** TERM_VNULL
c670: 20 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65   tag will suppre
c680: 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20  ss the not-null 
c690: 63 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67  check at the beg
c6a0: 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74  inning.  ** of t
c6b0: 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75  he loop.  Withou
c6c0: 74 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c  t the TERM_VNULL
c6d0: 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e   flag, the not-n
c6e0: 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a  ull check at.  *
c6f0: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
c700: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65  he loop will pre
c710: 76 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73  vent any results
c720: 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75   from being retu
c730: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rned..  */.  if(
c740: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
c750: 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78  OTNULL.   && pEx
c760: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
c770: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70  K_COLUMN.   && p
c780: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  Expr->pLeft->iCo
c790: 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20  lumn>=0.  ){.   
c7a0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
c7b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
c7c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
c7d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
c7e0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
c7f0: 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
c800: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
c810: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
c820: 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
c850: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c880: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
c890: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
c8a0: 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
c8b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c8c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c8d0: 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
c900: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
c910: 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
c920: 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
c930: 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
c940: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
c950: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c960: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
c970: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
c980: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
c990: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
c9a0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
c9b0: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
c9c0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
c9d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
c9e0: 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
c9f0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
ca00: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
ca10: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
ca20: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ca30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
ca40: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
ca50: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
ca60: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
ca70: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ca80: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
ca90: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
caa0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
cab0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
cac0: 53 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a 20 50  STAT2 */..  /* P
cad0: 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65  revent ON clause
cae0: 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54   terms of a LEFT
caf0: 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67   JOIN from being
cb00: 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20   used to drive. 
cb10: 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72   ** an index for
cb20: 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
cb30: 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
cb40: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70  .  */.  pTerm->p
cb50: 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78  rereqRight |= ex
cb60: 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a  traRight;.}../*.
cb70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cb80: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
cb90: 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73  ressions in pLis
cba0: 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20  t->a[iFirst...] 
cbb0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66  contain.** a ref
cbc0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61  erence to any ta
cbd0: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ble other than t
cbe0: 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a  he iBase table..
cbf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cc00: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
cc10: 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20  les(.  ExprList 
cc20: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
cc30: 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65   /* Search expre
cc40: 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69  ssions in ths li
cc50: 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  st */.  WhereMas
cc60: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
cc70: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
cc80: 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d  m tables to bitm
cc90: 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  aps */.  int iFi
cca0: 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
ccb0: 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69     /* Be searchi
ccc0: 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72  ng with the iFir
ccd0: 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e  st-th expression
cce0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20   */.  int iBase 
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65  /* Ignore refere
cd10: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
cd20: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61  le */.){.  Bitma
cd30: 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65  sk allowed = ~ge
cd40: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
cd50: 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28  iBase);.  while(
cd60: 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e   iFirst<pList->n
cd70: 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
cd80: 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
cd90: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
cda0: 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78  >a[iFirst++].pEx
cdb0: 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20  pr)&allowed)!=0 
cdc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cdd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
cde0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cdf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ce00: 73 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70  searches the exp
ce10: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73  ression list pas
ce20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
ce30: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f  d argument.** fo
ce40: 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  r an expression 
ce50: 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d  of type TK_COLUM
ce60: 4e 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  N that refers to
ce70: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
ce80: 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65   and.** uses the
ce90: 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20   same collation 
cea0: 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20  sequence as the 
ceb0: 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol'th column o
cec0: 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  f index pIdx..**
ced0: 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20   Argument iBase 
cee0: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
cef0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
cf00: 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64  e table that pId
cf10: 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a  x refers.** to..
cf20: 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e  **.** If such an
cf30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
cf40: 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20  ound, its index 
cf50: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73  in pList->a[] is
cf60: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
cf70: 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69   no expression i
cf80: 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72  s found, -1 is r
cf90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
cfa0: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78  ic int findIndex
cfb0: 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Col(.  Parse *pP
cfc0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
cfd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
cfe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
cff0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d010: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
d020: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d030: 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20  nt iBase,       
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62  * Cursor for tab
d060: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
d070: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  th pIdx */.  Ind
d080: 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20  ex *pIdx,       
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0a0: 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63  Index to match c
d0b0: 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e  olumn of */.  in
d0c0: 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0e0: 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   Column of index
d0f0: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
d100: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d110: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
d120: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c  Idx->azColl[iCol
d130: 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ];..  for(i=0; i
d140: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
d150: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d160: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
d170: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 49  Expr;.    if( pI
d180: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  dx->aiColumn[iCo
d190: 6c 5d 3d 3d 70 2d 3e 69 43 6f 6c 75 6d 6e 20 26  l]==p->iColumn &
d1a0: 26 20 69 42 61 73 65 3d 3d 70 2d 3e 69 54 61 62  & iBase==p->iTab
d1b0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  le ){.      Coll
d1c0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
d1d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
d1e0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
d1f0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 30    if( pColl && 0
d200: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
d210: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
d220: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
d230: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20   return i;.     
d240: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d250: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
d260: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d270: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 70   determines if p
d280: 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  Idx can be used 
d290: 74 6f 20 61 73 73 69 73 74 20 69 6e 20 70 72 6f  to assist in pro
d2a0: 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 44 49 53  cessing a.** DIS
d2b0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2e  TINCT qualifier.
d2c0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
d2d0: 20 69 74 20 74 65 73 74 73 20 77 68 65 74 68 65   it tests whethe
d2e0: 72 20 6f 72 20 6e 6f 74 20 75 73 69 6e 67 20 74  r or not using t
d2f0: 68 69 73 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  his.** index for
d300: 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
d310: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
d320: 72 6f 77 73 20 77 69 74 68 20 65 71 75 61 6c 20  rows with equal 
d330: 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 61 6c  values for.** al
d340: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
d350: 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 20 6c   the pDistinct l
d360: 69 73 74 20 61 72 65 20 64 65 6c 69 76 65 72 65  ist are delivere
d370: 64 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  d grouped togeth
d380: 65 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  er..**.** For ex
d390: 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
d3a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54   .**.**   SELECT
d3b0: 20 44 49 53 54 49 4e 43 54 20 61 2c 20 62 2c 20   DISTINCT a, b, 
d3c0: 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45  c FROM tbl WHERE
d3d0: 20 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e   a = ?.**.** can
d3e0: 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 61 6e   benefit from an
d3f0: 79 20 69 6e 64 65 78 20 6f 6e 20 63 6f 6c 75 6d  y index on colum
d400: 6e 73 20 22 62 22 20 61 6e 64 20 22 63 22 2e 0a  ns "b" and "c"..
d410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
d420: 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 0a 20  DistinctIndex(. 
d430: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d460: 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
d470: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
d480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d490: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
d4a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
d4d0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
d4e0: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
d510: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
d520: 62 6c 65 20 70 49 64 78 20 69 73 20 6f 6e 20 2a  ble pIdx is on *
d530: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
d540: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
d550: 20 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49      /* The DISTI
d560: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 20  NCT expressions 
d570: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 20  */.  int nEqCol 
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d5a0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
d5b0: 77 69 74 68 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20  with == */.){.  
d5c0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
d5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 6e 61 63 63  /* Mask of unacc
d5f0: 6f 75 6e 74 65 64 20 66 6f 72 20 70 44 69 73 74  ounted for pDist
d600: 69 6e 63 74 20 65 78 70 72 73 20 2a 2f 0a 20 20  inct exprs */.  
d610: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
d640: 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  able */..  if( p
d650: 49 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  Idx->zName==0 ||
d660: 20 70 44 69 73 74 69 6e 63 74 3d 3d 30 20 7c 7c   pDistinct==0 ||
d670: 20 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70   pDistinct->nExp
d680: 72 3e 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20  r>=BMS ) return 
d690: 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  0;..  /* Loop th
d6a0: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65 78  rough all the ex
d6b0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
d6c0: 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e 20   distinct list. 
d6d0: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20  If any of them. 
d6e0: 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d 70   ** are not simp
d6f0: 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65  le column refere
d700: 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61 72  nces, return ear
d710: 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ly. Otherwise, t
d720: 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  est if the.  ** 
d730: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
d740: 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20  tains a "col=X" 
d750: 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64 6f  clause. If it do
d760: 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  es, the expressi
d770: 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 69  on.  ** can be i
d780: 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64 6f  gnored. If it do
d790: 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20  es not, and the 
d7a0: 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20  column does not 
d7b0: 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20  belong to the.  
d7c0: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73  ** same table as
d7d0: 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65 74   index pIdx, ret
d7e0: 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c  urn early. Final
d7f0: 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  ly, if there is 
d800: 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67  no.  ** matching
d810: 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73 73   "col=X" express
d820: 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ion and the colu
d830: 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d  mn is on the sam
d840: 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78 2c  e table as pIdx,
d850: 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 6f  .  ** set the co
d860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
d870: 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73 6b  in variable mask
d880: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
d890: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
d8a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d8b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
d8c0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  ;.    Expr *p = 
d8d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
d8e0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
d8f0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
d900: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
d910: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
d920: 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  (pWC, p->iTable,
d930: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28 42   p->iColumn, ~(B
d940: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
d950: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   0);.    if( pTe
d960: 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rm ){.      Expr
d970: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
d980: 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
d990: 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65 33  eq *p1 = sqlite3
d9a0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
d9b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
d9c0: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
d9d0: 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ht);.      CollS
d9e0: 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65 33  eq *p2 = sqlite3
d9f0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
da00: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
da10: 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74 69  ( p1==p2 ) conti
da20: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
da30: 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62 61  f( p->iTable!=ba
da40: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  se ) return 0;. 
da50: 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42 69     mask |= (((Bi
da60: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b 0a  tmask)1) << i);.
da70: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45 71    }..  for(i=nEq
da80: 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c 70  Col; mask && i<p
da90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
daa0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78 70  +){.    int iExp
dab0: 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  r = findIndexCol
dac0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
dad0: 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c 20  ct, base, pIdx, 
dae0: 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78 70  i);.    if( iExp
daf0: 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  r<0 ) break;.   
db00: 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69 74   mask &= ~(((Bit
db10: 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70 72  mask)1) << iExpr
db20: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
db30: 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a 0a   (mask==0);.}...
db40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
db50: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
db60: 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
db70: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
db80: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
db90: 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  * is redundant. 
dba0: 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
dbb0: 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
dbc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
dbd0: 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51 55  tains a.** UNIQU
dbe0: 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75 61  E index that gua
dbf0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
dc00: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 71   result of the q
dc10: 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69 73  uery will be dis
dc20: 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79 2e  tinct.** anyway.
dc30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
dc40: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
dc50: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
dc60: 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse,.  SrcList *
dc70: 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65 72  pTabList,.  Wher
dc80: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
dc90: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
dca0: 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a  nct.){.  Table *
dcb0: 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
dcc0: 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Idx;.  int i;   
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42         .  int iB
dcf0: 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ase;..  /* If th
dd00: 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
dd10: 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
dd20: 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20  b-select in the 
dd30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20  FROM clause of. 
dd40: 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20   ** this query, 
dd50: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
dd60: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
dd70: 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49  show that the DI
dd80: 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61  STINCT .  ** cla
dd90: 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74  use is redundant
dda0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c  . */.  if( pTabL
ddb0: 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  ist->nSrc!=1 ) r
ddc0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65  eturn 0;.  iBase
ddd0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
dde0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61  ].iCursor;.  pTa
ddf0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
de00: 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
de10: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
de20: 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49  ressions is an I
de30: 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62  PK column on tab
de40: 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72  le iBase, then r
de50: 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65  eturn .  ** true
de60: 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e  . Note: The (p->
de70: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70  iTable==iBase) p
de80: 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74  art of this test
de90: 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66   may be false if
dea0: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
deb0: 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f  t SELECT is a co
dec0: 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
ded0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
dee0: 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d  =0; i<pDistinct-
def0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
df00: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69 73    Expr *p = pDis
df10: 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  tinct->a[i].pExp
df20: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  r;.    if( p->op
df30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
df40: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
df50: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
df60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
df70: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
df80: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
df90: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
dfa0: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
dfb0: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
dfc0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
dfd0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
dfe0: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
dff0: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
e000: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
e010: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
e020: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
e030: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
e040: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
e050: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
e060: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
e070: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
e080: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
e090: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
e0a0: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
e0b0: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
e0c0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
e0d0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
e0e0: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
e0f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
e100: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
e110: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
e120: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
e130: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
e140: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
e150: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
e160: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e170: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e180: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e190: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
e1a0: 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63  ror==OE_None ) c
e1b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
e1c0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
e1d0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
e1e0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
e1f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
e200: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69  .      if( 0==fi
e210: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
e220: 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61  e, iCol, ~(Bitma
e230: 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  sk)0, WO_EQ, pId
e240: 78 29 20 0a 20 20 20 20 20 20 20 26 26 20 30 3e  x) .       && 0>
e250: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
e260: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
e270: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 0a  iBase, pIdx, i).
e280: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e2a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
e2b0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
e2c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e2d0: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
e2e0: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
e2f0: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
e300: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
e310: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
e320: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
e330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e340: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
e350: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
e360: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
e370: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
e380: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
e390: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
e3a0: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
e3b0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
e3c0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
e3d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
e3e0: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
e3f0: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
e400: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
e410: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
e420: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
e430: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
e440: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
e450: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
e460: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
e470: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
e480: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
e490: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
e4a0: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
e4b0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
e4c0: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
e4d0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
e4e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
e4f0: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
e500: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
e510: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
e520: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
e530: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
e540: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
e550: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
e560: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
e570: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
e580: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
e590: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
e5a0: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
e5b0: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
e5c0: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
e5d0: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
e5e0: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
e5f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
e600: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
e610: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
e620: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
e630: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
e640: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
e650: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
e660: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
e670: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e680: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
e690: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
e6a0: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
e6b0: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
e6c0: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
e6d0: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
e6e0: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
e6f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
e700: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e710: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
e720: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
e730: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
e740: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
e750: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
e760: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
e770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e780: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
e790: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
e7a0: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
e7b0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
e7c0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
e7d0: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
e7e0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
e7f0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
e800: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
e810: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
e820: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
e830: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
e840: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
e850: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
e860: 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 2c  /.  int wsFlags,
e870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e880: 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61 67  ndex usages flag
e890: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
e8a0: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
e8b0: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
e8c0: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
e8d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e900: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
e910: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e930: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
e940: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
e950: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
e960: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e980: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
e990: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
e9a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e9b0: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
e9c0: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
e9d0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e9e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e9f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
ea00: 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20    if( !pOrderBy 
ea10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ea20: 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
ea30: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72 65  E_COLUMN_IN ) re
ea40: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
ea50: 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  dx->bUnordered )
ea60: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 54   return 0;..  nT
ea70: 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
ea80: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
ea90: 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
eaa0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
eab0: 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e  must either poin
eac0: 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61  t to a 'real' na
ead0: 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74  med index struct
eae0: 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e  ure, .  ** or an
eaf0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
eb00: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
eb10: 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42  e stack by bestB
eb20: 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20  treeIndex() to. 
eb30: 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68   ** represent th
eb40: 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68  e rowid index th
eb50: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76  at is part of ev
eb60: 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ery table.  */. 
eb70: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a   assert( pIdx->z
eb80: 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  Name || (pIdx->n
eb90: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
eba0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ebb0: 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  -1) );..  /* Mat
ebc0: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
ebd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ebe0: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
ebf0: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
ec00: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  x..  **.  ** Not
ec10: 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68  e that indices h
ec20: 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ave pIdx->nColum
ec30: 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  n regular column
ec40: 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20  s plus.  ** one 
ec50: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
ec60: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
ec70: 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77   rowid.  The row
ec80: 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  id column.  ** o
ec90: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
eca0: 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d  lso allowed to m
ecb0: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
ecc0: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
ecd0: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  lause..  */.  fo
ece0: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
ecf0: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
ed00: 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
ed10: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
ed20: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
ed30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
ed40: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f  ression of the O
ed50: 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f  RDER BY pTerm */
ed60: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
ed70: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  oll;    /* The c
ed80: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ed90: 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  e of pExpr */.  
eda0: 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72    int termSortOr
edb0: 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64  der; /* Sort ord
edc0: 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  er for this term
edd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
ede0: 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  umn;       /* Th
edf0: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
ee00: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20   the index.  -1 
ee10: 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  for rowid */.   
ee20: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b   int iSortOrder;
ee30: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53      /* 1 for DES
ee40: 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20  C, 0 for ASC on 
ee50: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74  the i-th index t
ee60: 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  erm */.    const
ee70: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a   char *zColl; /*
ee80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
ee90: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
eea0: 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74  for i-th index t
eeb0: 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  erm */..    pExp
eec0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
eed0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
eee0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
eef0: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
ef00: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
ef10: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
ef20: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
ef30: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
ef40: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
ef50: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
ef60: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
ef70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ef80: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
ef90: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
efa0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
efb0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
efc0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
efd0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
efe0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
eff0: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
f000: 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26  ( pIdx->zName &&
f010: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
f020: 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d   ){.      iColum
f030: 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  n = pIdx->aiColu
f040: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
f050: 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e   iColumn==pIdx->
f060: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b  pTable->iPKey ){
f070: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
f080: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
f090: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
f0a0: 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
f0b0: 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f  er[i];.      zCo
f0c0: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
f0d0: 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l[i];.    }else{
f0e0: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
f0f0: 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74   -1;.      iSort
f100: 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Order = 0;.     
f110: 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e   zColl = pColl->
f120: 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20  zName;.    }.   
f130: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
f140: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20  umn!=iColumn || 
f150: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
f160: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
f170: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ll) ){.      /* 
f180: 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52  Term j of the OR
f190: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f  DER BY clause do
f1a0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c  es not match col
f1b0: 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64  umn i of the ind
f1c0: 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
f1d0: 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i<nEqCol ){.    
f1e0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
f1f0: 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69  ex column that i
f200: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
f210: 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74   == fails to mat
f220: 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ch an.        **
f230: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20   ORDER BY term, 
f240: 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73  that is OK.  Jus
f250: 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f  t ignore that co
f260: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
f270: 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  x.        */.   
f280: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f290: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f2a0: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
f2b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
f2c0: 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20  dex column i is 
f2d0: 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20  the rowid.  All 
f2e0: 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63  other terms matc
f2f0: 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  h. */.        br
f300: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
f310: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f320: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
f330: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
f340: 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72  nd is not constr
f350: 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20  ained by ==.    
f360: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
f370: 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74  index cannot sat
f380: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
f390: 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  Y constraint..  
f3a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f3b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
f3c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f3d0: 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74  ert( pIdx->aSort
f3e0: 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c  Order!=0 || iCol
f3f0: 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  umn==-1 );.    a
f400: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f  ssert( pTerm->so
f410: 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54  rtOrder==0 || pT
f420: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
f430: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
f440: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c   iSortOrder==0 |
f450: 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20  | iSortOrder==1 
f460: 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
f470: 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65  rder = iSortOrde
f480: 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  r ^ pTerm->sortO
f490: 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e  rder;.    if( i>
f4a0: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
f4b0: 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
f4c0: 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  r!=sortOrder ){.
f4d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
f4e0: 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  es can only be u
f4f0: 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52  sed if all ORDER
f500: 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74   BY terms past t
f510: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71  he.        ** eq
f520: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
f530: 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ts are all eithe
f540: 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a  r DESC or ASC. *
f550: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f560: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
f570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72  }else{.      sor
f580: 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
f590: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
f5a0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
f5b0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
f5c0: 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65  umn<0 && !refere
f5d0: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
f5e0: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
f5f0: 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a  et, j, base) ){.
f600: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f610: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69  indexed column i
f620: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
f630: 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67  y and everything
f640: 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a   matches.      *
f650: 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e  * so far and non
f660: 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  e of the ORDER B
f670: 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72  Y terms to the r
f680: 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f  ight reference o
f690: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61  ther.      ** ta
f6a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
f6b0: 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73  , then we are as
f6c0: 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69  sured that the i
f6d0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
f6e0: 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f   .      ** to so
f6f0: 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  rt because the p
f700: 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e  rimary key is un
f710: 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65  ique and so none
f720: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20   of the other.  
f730: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77      ** columns w
f740: 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66  ill make any dif
f750: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f  ference.      */
f760: 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d  .      j = nTerm
f770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f780: 66 28 20 70 62 52 65 76 20 29 20 2a 70 62 52 65  f( pbRev ) *pbRe
f790: 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30  v = sortOrder!=0
f7a0: 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d  ;.  if( j>=nTerm
f7b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
f7c0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
f7d0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
f7e0: 63 6f 76 65 72 65 64 20 62 79 20 74 68 69 73 20  covered by this 
f7f0: 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a 20  index so.    ** 
f800: 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20 62  this index can b
f810: 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69  e used for sorti
f820: 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ng. */.    retur
f830: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
f840: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
f850: 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64 78  _None && i==pIdx
f860: 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ->nColumn.      
f870: 26 26 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  && (wsFlags & WH
f880: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
f890: 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 21 72 65  ==0.      && !re
f8a0: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
f8b0: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
f8c0: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
f8d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74   ){.    /* All t
f8e0: 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64  erms of this ind
f8f0: 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72  ex match some pr
f900: 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45  efix of the ORDE
f910: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
f920: 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
f930: 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e   is UNIQUE and n
f940: 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74  o terms on the t
f950: 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ail of the ORDER
f960: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
f970: 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  e reference othe
f980: 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  r tables in a jo
f990: 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  in.  If this is 
f9a0: 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20  all true then.  
f9b0: 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62    ** the order b
f9c0: 79 20 63 6c 61 75 73 65 20 69 73 20 73 75 70 65  y clause is supe
f9d0: 72 66 6c 75 6f 75 73 2e 20 20 4e 6f 74 20 74 68  rfluous.  Not th
f9e0: 61 74 20 69 66 20 74 68 65 20 6d 61 74 63 68 69  at if the matchi
f9f0: 6e 67 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  ng.    ** condit
fa00: 69 6f 6e 20 69 73 20 49 53 20 4e 55 4c 4c 20 74  ion is IS NULL t
fa10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
fa20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
fa30: 79 20 75 6e 69 71 75 65 0a 20 20 20 20 2a 2a 20  y unique.    ** 
fa40: 65 76 65 6e 20 6f 6e 20 61 20 55 4e 49 51 55 45  even on a UNIQUE
fa50: 20 69 6e 64 65 78 2c 20 73 6f 20 64 69 73 61 6c   index, so disal
fa60: 6c 6f 77 20 74 68 6f 73 65 20 63 61 73 65 73 2e  low those cases.
fa70: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
fa80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fa90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
faa0: 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d  re a crude estim
fab0: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72  ate of the logar
fac0: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
fad0: 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  t value..** The 
fae0: 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74  results need not
faf0: 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73   be exact.  This
fb00: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
fb10: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20  r estimating.** 
fb20: 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f  the total cost o
fb30: 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65  f performing ope
fb40: 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28 6c  rations with O(l
fb50: 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29  ogN) or O(NlogN)
fb60: 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20  .** complexity. 
fb70: 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75   Because N is ju
fb80: 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69  st a guess, it i
fb90: 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65  s no great trage
fba0: 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73  dy if.** logN is
fbb0: 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a   a little off..*
fbc0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
fbd0: 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29  estLog(double N)
fbe0: 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20  {.  double logN 
fbf0: 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20  = 1;.  double x 
fc00: 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e  = 10;.  while( N
fc10: 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b  >x ){.    logN +
fc20: 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  = 1;.    x *= 10
fc30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
fc40: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  ogN;.}../*.** Tw
fc50: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
fc60: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
fc70: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
fc80: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
fc90: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
fca0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
fcb0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
fcc0: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
fcd0: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
fce0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
fcf0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
fd00: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
fd10: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
fd20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fd30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fd40: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
fd50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
fd60: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
fd70: 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69  _IDX_INPUTS(sqli
fd80: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
fd90: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
fda0: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
fdb0: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
fdc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fdd0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
fde0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
fdf0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e  bugPrintf("  con
fe00: 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c  straint[%d]: col
fe10: 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70  =%d termid=%d op
fe20: 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e  =%d usabled=%d\n
fe30: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
fe40: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
fe50: 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  nt[i].iColumn,. 
fe60: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
fe70: 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66  aint[i].iTermOff
fe80: 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  set,.       p->a
fe90: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70  Constraint[i].op
fea0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
feb0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
fec0: 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
fed0: 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79  0; i<p->nOrderBy
fee0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
fef0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
ff00: 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63    orderby[%d]: c
ff10: 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22  ol=%d desc=%d\n"
ff20: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
ff30: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
ff40: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
ff50: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
ff60: 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74  .desc);.  }.}.st
ff70: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
ff80: 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69  IDX_OUTPUTS(sqli
ff90: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
ffa0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
ffb0: 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72 65  f( !sqlite3Where
ffc0: 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a  Trace ) return;.
ffd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
ffe0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
fff0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
10000 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61  bugPrintf("  usa
10010 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d  ge[%d]: argvIdx=
10020 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20  %d omit=%d\n",. 
10030 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
10040 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
10050 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
10060 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
10070 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
10080 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  omit);.  }.  sql
10090 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
100a0 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c  "  idxNum=%d\n",
100b0 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73   p->idxNum);.  s
100c0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
100d0 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e  f("  idxStr=%s\n
100e0 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20  ", p->idxStr);. 
100f0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10100 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f  ntf("  orderByCo
10110 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d  nsumed=%d\n", p-
10120 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
10130 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
10140 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d  gPrintf("  estim
10150 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20  atedCost=%g\n", 
10160 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  p->estimatedCost
10170 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
10180 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
10190 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
101a0 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
101b0 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  (A).#endif../* .
101c0 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65 63 61  ** Required beca
101d0 75 73 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  use bestIndex() 
101e0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62 65 73  is called by bes
101f0 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 29  tOrClauseIndex()
10200 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
10210 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 20 20   bestIndex(.    
10220 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43 6c 61  Parse*, WhereCla
10230 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53 72 63  use*, struct Src
10240 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a 20 20 20 20  List_item*,.    
10250 42 69 74 6d 61 73 6b 2c 20 42 69 74 6d 61 73 6b  Bitmask, Bitmask
10260 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 57 68 65  , ExprList*, Whe
10270 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  reCost*);../*.**
10280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
10290 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 61  tempts to find a
102a0 6e 20 73 63 61 6e 6e 69 6e 67 20 73 74 72 61 74  n scanning strat
102b0 65 67 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  egy that can be 
102c0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69  used .** to opti
102d0 6d 69 7a 65 20 61 6e 20 27 4f 52 27 20 65 78 70  mize an 'OR' exp
102e0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
102f0 70 61 72 74 20 6f 66 20 61 20 57 48 45 52 45 20  part of a WHERE 
10300 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  clause. .**.** T
10310 68 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  he table associa
10320 74 65 64 20 77 69 74 68 20 46 52 4f 4d 20 63 6c  ted with FROM cl
10330 61 75 73 65 20 74 65 72 6d 20 70 53 72 63 20 6d  ause term pSrc m
10340 61 79 20 62 65 20 65 69 74 68 65 72 20 61 0a 2a  ay be either a.*
10350 2a 20 72 65 67 75 6c 61 72 20 42 2d 54 72 65 65  * regular B-Tree
10360 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
10370 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
10380 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 4f 72  atic void bestOr
10390 43 6c 61 75 73 65 49 6e 64 65 78 28 0a 20 20 50  ClauseIndex(.  P
103a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
103b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
103c0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
103d0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
103e0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
103f0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
10400 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
10410 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
10420 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
10430 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
10440 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
10450 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
10460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10470 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
10480 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
10490 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
104a0 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
104b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
104c0 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
104d0 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  le for any purpo
104e0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
104f0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
10500 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
10510 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
10520 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
10530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10540 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
10550 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e   plan */.){.#ifn
10560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10570 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
10580 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72    const int iCur
10590 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
105a0 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
105b0 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
105c0 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
105d0 0a 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73 6b  .  const Bitmask
105e0 20 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d 61   maskSrc = getMa
105f0 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
10600 2c 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69 74  , iCur);  /* Bit
10610 6d 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a 2f  mask for pSrc */
10620 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63  .  WhereTerm * c
10630 6f 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26 70  onst pWCEnd = &p
10640 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d  WC->a[pWC->nTerm
10650 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  ];        /* End
10660 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
10670 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
10680 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
10690 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
106a0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
106b0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  E clause */..  /
106c0 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75 73 65 20 6f  * No OR-clause o
106d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 6c 6f  ptimization allo
106e0 77 65 64 20 69 66 20 74 68 65 20 49 4e 44 45 58  wed if the INDEX
106f0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
10700 45 58 45 44 20 63 6c 61 75 73 65 73 0a 20 20 2a  EXED clauses.  *
10710 2a 20 61 72 65 20 75 73 65 64 20 2a 2f 0a 20 20  * are used */.  
10720 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
10730 65 78 65 64 20 7c 7c 20 70 53 72 63 2d 3e 70 49  exed || pSrc->pI
10740 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 72  ndex!=0 ){.    r
10750 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
10760 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45 52   Search the WHER
10770 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
10780 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f  or a usable WO_O
10790 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72  R term. */.  for
107a0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
107b0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
107c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
107d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
107e0 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26 20  =WO_OR .     && 
107f0 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ((pTerm->prereqA
10800 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20 26  ll & ~maskSrc) &
10810 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
10820 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
10830 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
10840 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d 30  le & maskSrc)!=0
10850 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
10860 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
10870 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
10880 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
10890 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
108a0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
108b0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
108c0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
108d0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
108e0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
108f0 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  t flags = WHERE_
10900 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
10910 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20  double rTotal = 
10920 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  0;.      double 
10930 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRow = 0;.      
10940 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
10950 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
10960 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
10970 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
10980 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
10990 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
109a0 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20  TermCost;.      
109b0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
109c0 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
109d0 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
109e0 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
109f0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
10a00 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
10a10 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
10a20 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
10a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
10a40 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
10a50 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==WO_AND ){.    
10a60 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
10a70 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f 72  e *pAndWC = &pOr
10a80 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
10a90 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20  ->wc;.          
10aa0 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
10ab0 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c 20  , pAndWC, pSrc, 
10ac0 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c  notReady, notVal
10ad0 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73  id, 0, &sTermCos
10ae0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
10af0 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  e if( pOrTerm->l
10b00 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
10b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  ){.          Whe
10b20 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b  reClause tempWC;
10b30 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
10b40 43 2e 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e  C.pParse = pWC->
10b50 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
10b60 20 20 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65    tempWC.pMaskSe
10b70 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65  t = pWC->pMaskSe
10b80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  t;.          tem
10b90 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  pWC.op = TK_AND;
10ba0 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
10bb0 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20  C.a = pOrTerm;. 
10bc0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
10bd0 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  nTerm = 1;.     
10be0 20 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70       bestIndex(p
10bf0 50 61 72 73 65 2c 20 26 74 65 6d 70 57 43 2c 20  Parse, &tempWC, 
10c00 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
10c10 6e 6f 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54  notValid, 0, &sT
10c20 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ermCost);.      
10c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10c40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
10c60 54 6f 74 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f  Total += sTermCo
10c70 73 74 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  st.rCost;.      
10c80 20 20 6e 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43    nRow += sTermC
10c90 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20  ost.plan.nRow;. 
10ca0 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 73         used |= s
10cb0 54 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20  TermCost.used;. 
10cc0 20 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61         if( rTota
10cd0 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  l>=pCost->rCost 
10ce0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
10cf0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
10d00 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
10d10 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
10d20 61 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73  ase the scan cos
10d30 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20  t to account .  
10d40 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63      ** for the c
10d50 6f 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e  ost of the sort.
10d60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
10d70 72 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20  rderBy!=0 ){.   
10d80 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10d90 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
10da0 63 72 65 61 73 65 73 20 4f 52 20 63 6f 73 74 20  creases OR cost 
10db0 25 2e 39 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  %.9g to %.9g\n",
10dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10dd0 20 20 20 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f       rTotal, rTo
10de0 74 61 6c 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28  tal+nRow*estLog(
10df0 6e 52 6f 77 29 29 29 3b 0a 20 20 20 20 20 20 20  nRow)));.       
10e00 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a   rTotal += nRow*
10e10 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20  estLog(nRow);.  
10e20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10e30 49 66 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73  If the cost of s
10e40 63 61 6e 6e 69 6e 67 20 75 73 69 6e 67 20 74 68  canning using th
10e50 69 73 20 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f  is OR term for o
10e60 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20  ptimization is. 
10e70 20 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61       ** less tha
10e80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  n the current co
10e90 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 43 6f  st stored in pCo
10ea0 73 74 2c 20 72 65 70 6c 61 63 65 20 74 68 65 20  st, replace the 
10eb0 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 2a  contents.      *
10ec0 2a 20 6f 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20  * of pCost. */. 
10ed0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
10ee0 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65  ("... multi-inde
10ef0 78 20 4f 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e  x OR cost=%.9g n
10f00 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f  row=%.9g\n", rTo
10f10 74 61 6c 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20  tal, nRow));.   
10f20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3c 70 43     if( rTotal<pC
10f30 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
10f40 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
10f50 73 74 20 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20  st = rTotal;.   
10f60 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64       pCost->used
10f70 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20   = used;.       
10f80 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f   pCost->plan.nRo
10f90 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  w = nRow;.      
10fa0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
10fb0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
10fc0 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c         pCost->pl
10fd0 61 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65  an.u.pTerm = pTe
10fe0 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
10ff0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
11000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
11010 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d  PTIMIZATION */.}
11020 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11030 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
11040 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
11050 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
11060 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
11070 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
11080 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
11090 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
110a0 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
110b0 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
110c0 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
110d0 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
110e0 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
110f0 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
11100 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
11110 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
11120 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
11130 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
11140 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
11150 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11160 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
11170 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
11180 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
11190 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
111b0 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
111c0 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
111d0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
111e0 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
111f0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
11200 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
11210 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
11220 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
11230 3d 57 4f 5f 45 51 20 29 20 72 65 74 75 72 6e 20  =WO_EQ ) return 
11240 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
11250 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
11260 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 72 65  otReady)!=0 ) re
11270 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
11280 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
11290 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
112a0 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
112b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
112c0 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
112d0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
112e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
112f0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
11300 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
11310 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
11320 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20  _INDEX./*.** If 
11330 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
11340 6f 72 20 70 53 72 63 20 73 70 65 63 69 66 69 65  or pSrc specifie
11350 64 20 69 6e 20 70 43 6f 73 74 20 69 73 20 61 20  d in pCost is a 
11360 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a  full table scan.
11370 2a 2a 20 61 6e 64 20 69 6e 64 65 78 69 6e 67 20  ** and indexing 
11380 69 73 20 61 6c 6c 6f 77 73 20 28 69 66 20 74 68  is allows (if th
11390 65 72 65 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e  ere is no NOT IN
113a0 44 45 58 45 44 20 63 6c 61 75 73 65 29 20 61 6e  DEXED clause) an
113b0 64 20 69 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  d it.** possible
113c0 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
113d0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
113e0 74 68 61 74 20 77 6f 75 6c 64 20 70 65 72 66 6f  that would perfo
113f0 72 6d 20 62 65 74 74 65 72 0a 2a 2a 20 74 68 61  rm better.** tha
11400 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
11410 63 61 6e 20 65 76 65 6e 20 77 68 65 6e 20 74 68  can even when th
11420 65 20 63 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72  e cost of constr
11430 75 63 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  ucting the index
11440 0a 2a 2a 20 69 73 20 74 61 6b 65 6e 20 69 6e 74  .** is taken int
11450 6f 20 61 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20  o account, then 
11460 61 6c 74 65 72 20 74 68 65 20 71 75 65 72 79 20  alter the query 
11470 70 6c 61 6e 20 74 6f 20 75 73 65 20 74 68 65 0a  plan to use the.
11480 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
11490 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
114a0 69 64 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  id bestAutomatic
114b0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
114c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
114d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
114e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
114f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
11500 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
11510 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11520 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11530 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
11540 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
11550 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
11560 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
11570 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
11580 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
11590 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
115a0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
115b0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
115c0 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Cost            
115d0 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
115e0 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
115f0 20 20 64 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52    double nTableR
11600 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ow;           /*
11610 20 52 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 70   Rows in the inp
11620 75 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f  ut table */.  do
11630 75 62 6c 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20  uble logN;      
11640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67            /* log
11650 28 6e 54 61 62 6c 65 52 6f 77 29 20 2a 2f 0a 20  (nTableRow) */. 
11660 20 64 6f 75 62 6c 65 20 63 6f 73 74 54 65 6d 70   double costTemp
11670 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
11680 70 65 72 2d 71 75 65 72 79 20 63 6f 73 74 20 6f  per-query cost o
11690 66 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  f the transient 
116a0 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
116b0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
116c0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
116d0 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
116e0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
116f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
11700 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
11710 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
11720 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
11730 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
11740 20 2f 2a 20 54 61 62 6c 65 20 74 68 74 20 6d 69   /* Table tht mi
11750 67 68 74 20 62 65 20 69 6e 64 65 78 65 64 20 2a  ght be indexed *
11760 2f 0a 0a 20 20 69 66 28 20 28 70 50 61 72 73 65  /..  if( (pParse
11770 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
11780 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d  LITE_AutoIndex)=
11790 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74  =0 ){.    /* Aut
117a0 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 61  omatic indices a
117b0 72 65 20 64 69 73 61 62 6c 65 64 20 61 74 20 72  re disabled at r
117c0 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72  un-time */.    r
117d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
117e0 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
117f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
11800 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29  T_FULLSCAN)!=0 )
11810 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65  {.    /* We alre
11820 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69  ady have some ki
11830 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75  nd of index in u
11840 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  se for this quer
11850 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  y. */.    return
11860 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
11870 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a  ->notIndexed ){.
11880 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49      /* The NOT I
11890 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61 70  NDEXED clause ap
118a0 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c  pears in the SQL
118b0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
118c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
118d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
118e0 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20  op >= (double)1 
118f0 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70 53  );.  pTable = pS
11900 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62  rc->pTab;.  nTab
11910 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e  leRow = pTable->
11920 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20  nRowEst;.  logN 
11930 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52  = estLog(nTableR
11940 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49  ow);.  costTempI
11950 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61  dx = 2*logN*(nTa
11960 62 6c 65 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e  bleRow/pParse->n
11970 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a  QueryLoop + 1);.
11980 20 20 69 66 28 20 63 6f 73 74 54 65 6d 70 49 64    if( costTempId
11990 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  x>=pCost->rCost 
119a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
119b0 73 74 20 6f 66 20 63 72 65 61 74 69 6e 67 20 74  st of creating t
119c0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
119d0 6c 65 20 77 6f 75 6c 64 20 62 65 20 67 72 65 61  le would be grea
119e0 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ter than.    ** 
119f0 64 6f 69 6e 67 20 74 68 65 20 66 75 6c 6c 20 74  doing the full t
11a00 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
11a10 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11a20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
11a30 79 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  y equality compa
11a40 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20  rison term */.  
11a50 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
11a60 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
11a70 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
11a80 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
11a90 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
11aa0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
11ab0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
11ac0 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
11ad0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
11ae0 22 61 75 74 6f 2d 69 6e 64 65 78 20 72 65 64 75  "auto-index redu
11af0 63 65 73 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e  ces cost from %.
11b00 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20  1f to %.1f\n",. 
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c     pCost->rCost,
11b30 20 63 6f 73 74 54 65 6d 70 49 64 78 29 29 3b 0a   costTempIdx));.
11b40 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
11b50 73 74 20 3d 20 63 6f 73 74 54 65 6d 70 49 64 78  st = costTempIdx
11b60 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
11b70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20  lan.nRow = logN 
11b80 2b 20 31 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  + 1;.      pCost
11b90 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
11ba0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
11bb0 58 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  X;.      pCost->
11bc0 75 73 65 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72  used = pTerm->pr
11bd0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
11be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11bf0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
11c00 6e 65 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  ne bestAutomatic
11c10 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29  Index(A,B,C,D,E)
11c20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65    /* no-op */.#e
11c30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11c40 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
11c50 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  DEX */...#ifndef
11c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11c70 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
11c80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11c90 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
11ca0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e Index object f
11cb0 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  or an automatic 
11cc0 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20  index.** and to 
11cd0 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65  set up the Where
11ce0 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65  Level object pLe
11cf0 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  vel so that the 
11d00 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
11d10 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74  * makes use of t
11d20 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
11d30 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
11d40 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f  id constructAuto
11d50 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
11d60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d80 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
11d90 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11da0 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
11db0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
11dc0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
11dd0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
11de0 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
11df0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
11e00 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69  o get the next i
11e10 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
11e20 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
11e30 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
11e40 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
11e50 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
11e60 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
11e70 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  *pLevel         
11e80 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e   /* Write new in
11e90 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  dex here */.){. 
11ea0 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   int nColumn;   
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ec0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
11ed0 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75  s in the constru
11ee0 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cted index */.  
11ef0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
11f00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
11f10 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
11f20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11f30 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11f40 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
11f50 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
11f60 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  >a[] */.  int nB
11f70 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
11f80 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
11f90 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 66   memory needed f
11fa0 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64  or pIdx */.  Ind
11fb0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
11fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
11fd0 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ct describing th
11fe0 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  e transient inde
11ff0 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
12020 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
12030 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
12040 20 69 6e 74 20 72 65 67 49 73 49 6e 69 74 3b 20   int regIsInit; 
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12060 52 65 67 69 73 74 65 72 20 73 65 74 20 62 79 20  Register set by 
12070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a  initialization *
12080 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74  /.  int addrInit
12090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
120b0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
120c0 20 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a   bypass jump */.
120d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120f0 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
12100 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65   indexed */.  Ke
12110 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b  yInfo *pKeyinfo;
12120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
12130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
12140 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20   the index */   
12150 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12170 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
12180 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
12190 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121b0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
121c0 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
121d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
12200 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
12230 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
12240 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
12250 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
12260 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
12270 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
12280 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
12290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
122a0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
122b0 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
122c0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78  */.  Bitmask idx
122d0 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  Cols;           
122e0 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f   /* Bitmap of co
122f0 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69  lumns used for i
12300 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74  ndexing */.  Bit
12310 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20  mask extraCols; 
12320 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
12330 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  ap of additional
12340 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f   columns */..  /
12350 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12360 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65  to skip over the
12370 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e   creation and in
12380 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
12390 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65  the.  ** transie
123a0 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20  nt index on 2nd 
123b0 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69  and subsequent i
123c0 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  terations of the
123d0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20   loop. */.  v = 
123e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
123f0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
12400 0a 20 20 72 65 67 49 73 49 6e 69 74 20 3d 20 2b  .  regIsInit = +
12410 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12420 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69   addrInit = sqli
12430 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12440 20 4f 50 5f 49 66 2c 20 72 65 67 49 73 49 6e 69   OP_If, regIsIni
12450 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
12460 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12470 74 65 67 65 72 2c 20 31 2c 20 72 65 67 49 73 49  teger, 1, regIsI
12480 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  nit);..  /* Coun
12490 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
124a0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
124b0 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
124c0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64  e index.  ** and
124d0 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57   used to match W
124e0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
124f0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f  traints */.  nCo
12500 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62  lumn = 0;.  pTab
12510 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  le = pSrc->pTab;
12520 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
12530 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
12540 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
12550 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
12560 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
12570 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
12580 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
12590 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
125a0 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
125b0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
125c0 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
125d0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
125e0 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
125f0 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73  >=BMS ? ((Bitmas
12600 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20  k)1)<<(BMS-1) : 
12610 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43  ((Bitmask)1)<<iC
12620 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
12630 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
12640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12650 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
12660 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
12670 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
12680 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d  {.        nColum
12690 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 78  n++;.        idx
126a0 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
126b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
126c0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75  .  assert( nColu
126d0 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c  mn>0 );.  pLevel
126e0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f  ->plan.nEq = nCo
126f0 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  lumn;..  /* Coun
12700 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
12710 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
12720 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63 72 65  ns needed to cre
12730 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72  ate a.  ** cover
12740 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20 22 63  ing index.  A "c
12750 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22 20 69  overing index" i
12760 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
12770 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a  contains all.  *
12780 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
12790 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
127a0 20 71 75 65 72 79 2e 20 20 57 69 74 68 20 61 20   query.  With a 
127b0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20  covering index, 
127c0 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
127d0 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20 6e 65  l table never ne
127e0 65 64 73 20 74 6f 20 62 65 20 61 63 63 65 73 73  eds to be access
127f0 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63 20 69  ed.  Automatic i
12800 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a  ndices must.  **
12810 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67 20 69   be a covering i
12820 6e 64 65 78 20 62 65 63 61 75 73 65 20 74 68 65  ndex because the
12830 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20   index will not 
12840 62 65 20 75 70 64 61 74 65 64 20 69 66 20 74 68  be updated if th
12850 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  e.  ** original 
12860 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20 61 6e  table changes an
12870 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  d the index and 
12880 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74  table cannot bot
12890 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a 20 69  h be used.  ** i
128a0 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20 6f 66  f they go out of
128b0 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78   sync..  */.  ex
128c0 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e  traCols = pSrc->
128d0 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64 78 43  colUsed & (~idxC
128e0 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d 61 73 6b  ols | (((Bitmask
128f0 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a  )1)<<(BMS-1)));.
12900 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70 54    mxBitCol = (pT
12910 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d  able->nCol >= BM
12920 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70  S-1) ? BMS-1 : p
12930 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74  Table->nCol;.  t
12940 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
12950 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
12960 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12970 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20  le->nCol==BMS-2 
12980 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
12990 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
129a0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
129b0 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
129c0 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b  )<<i) ) nColumn+
129d0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  +;.  }.  if( pSr
129e0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 28 28  c->colUsed & (((
129f0 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
12a00 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  -1)) ){.    nCol
12a10 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e  umn += pTable->n
12a20 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20  Col - BMS + 1;. 
12a30 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   }.  pLevel->pla
12a40 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  n.wsFlags |= WHE
12a50 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57  RE_COLUMN_EQ | W
12a60 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20  HERE_IDX_ONLY | 
12a70 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  WO_EQ;..  /* Con
12a80 73 74 72 75 63 74 20 74 68 65 20 49 6e 64 65 78  struct the Index
12a90 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72   object to descr
12aa0 69 62 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a  ibe this index *
12ab0 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  /.  nByte = size
12ac0 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79  of(Index);.  nBy
12ad0 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69  te += nColumn*si
12ae0 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f  zeof(int);     /
12af0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
12b00 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e   */.  nByte += n
12b10 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68  Column*sizeof(ch
12b20 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ar*);   /* Index
12b30 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79  .azColl */.  nBy
12b40 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20  te += nColumn;  
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b60 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
12b70 65 72 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  er */.  pIdx = s
12b80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12b90 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ro(pParse->db, n
12ba0 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64  Byte);.  if( pId
12bb0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  x==0 ) return;. 
12bc0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
12bd0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  pIdx = pIdx;.  p
12be0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
12bf0 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a  har**)&pIdx[1];.
12c00 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
12c10 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e   = (int*)&pIdx->
12c20 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b  azColl[nColumn];
12c30 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
12c40 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78  der = (u8*)&pIdx
12c50 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
12c60 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  mn];.  pIdx->zNa
12c70 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
12c80 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ";.  pIdx->nColu
12c90 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = nColumn;.  
12ca0 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
12cb0 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
12cc0 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
12cd0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
12ce0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
12cf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
12d00 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
12d10 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
12d20 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
12d30 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
12d40 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
12d50 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
12d60 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
12d70 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b  =BMS ? ((Bitmask
12d80 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28  )1)<<(BMS-1) : (
12d90 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f  (Bitmask)1)<<iCo
12da0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  l;.      if( (id
12db0 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
12dd0 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
12de0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
12df0 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
12e00 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
12e10 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
12e20 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
12e30 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
12e40 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
12e50 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
12e60 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
12e70 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
12e80 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
12e90 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43  l[n] = ALWAYS(pC
12ea0 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  oll) ? pColl->zN
12eb0 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
12ec0 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
12ed0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12ee0 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
12ef0 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45  =pLevel->plan.nE
12f00 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
12f10 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
12f20 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
12f30 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
12f40 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
12f50 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
12f60 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
12f70 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
12f80 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
12f90 73 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31  s & (((Bitmask)1
12fa0 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20 20 20 70  )<<i) ){.      p
12fb0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
12fc0 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
12fd0 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
12fe0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
12ff0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
13000 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
13010 20 26 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   & (((Bitmask)1)
13020 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
13030 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
13040 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
13050 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
13060 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
13070 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
13080 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
13090 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
130a0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
130b0 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  t( n==nColumn );
130c0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
130d0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
130e0 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20  x */.  pKeyinfo 
130f0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
13100 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
13110 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dx);.  assert( p
13120 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
13130 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
13140 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
13150 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c  penAutoindex, pL
13160 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e  evel->iIdxCur, n
13170 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20  Column+1, 0,.   
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 28 63 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f   (char*)pKeyinfo
131a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
131b0 44 4f 46 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d  DOFF);.  VdbeCom
131c0 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73  ment((v, "for %s
131d0 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
131e0 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74  ));..  /* Fill t
131f0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
13200 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e 74 20  ex with content 
13210 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
13220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13230 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
13240 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b  Level->iTabCur);
13250 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
13260 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13270 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
13280 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
13290 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  Key(pParse, pIdx
132a0 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
132b0 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29  r, regRecord, 1)
132c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
132d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
132e0 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  nsert, pLevel->i
132f0 49 64 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72  IdxCur, regRecor
13300 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
13310 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
13320 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
13330 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
13340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13350 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  xt, pLevel->iTab
13360 43 75 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Cur, addrTop+1);
13370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
13380 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
13390 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
133a0 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65  INDEX);.  sqlite
133b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
133c0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
133d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
133e0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
133f0 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  cord);.  .  /* J
13400 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
13410 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
13420 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
13430 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13440 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
13450 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13460 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
13470 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
13480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13490 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
134a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
134b0 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
134c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
134d0 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
134e0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
134f0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
13500 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
13510 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
13520 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
13530 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
13540 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
13550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
13560 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
13570 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
13580 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
13590 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
135a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
135b0 65 2c 20 0a 20 20 57 68 65 72 65 43 6c 61 75 73  e, .  WhereClaus
135c0 65 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74  e *pWC,.  struct
135d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
135e0 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
135f0 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69  *pOrderBy.){.  i
13600 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
13610 54 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73  Term;.  struct s
13620 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
13630 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
13640 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
13650 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
13660 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a  y *pIdxOrderBy;.
13670 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
13680 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
13690 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
136a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
136b0 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  erm;.  int nOrde
136c0 72 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rBy;.  sqlite3_i
136d0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
136e0 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45 54 52 41  nfo;..  WHERETRA
136f0 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
13700 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
13710 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e  %s...\n", pSrc->
13720 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  pTab->zName));..
13730 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
13740 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
13750 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
13760 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
13770 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
13780 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
13790 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
137a0 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
137b0 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
137c0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
137d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
137e0 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
137f0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
13800 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
13810 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
13820 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
13830 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
13840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13850 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
13860 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
13870 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
13880 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
13890 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
138a0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
138b0 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
138c0 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
138d0 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a     nTerm++;.  }.
138e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44  .  /* If the ORD
138f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
13900 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
13910 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
13920 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  t .  ** virtual 
13930 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
13940 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
13950 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
13960 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  of.  ** the sqli
13970 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13980 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20  tructure..  */. 
13990 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
139a0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
139b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
139c0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
139d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
139e0 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
139f0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
13a00 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
13a10 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
13a20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
13a30 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
13a40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13a50 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72     if( i==pOrder
13a60 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
13a70 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f     nOrderBy = pO
13a80 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
13a90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13aa0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
13ab0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
13ac0 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20  tructure.  */.  
13ad0 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
13ae0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
13af0 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
13b00 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20  f(*pIdxInfo).   
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
13b30 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
13b40 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
13b50 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
13b80 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
13b90 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e   );.  if( pIdxIn
13ba0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  fo==0 ){.    sql
13bb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13bc0 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
13bd0 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64  ory");.    /* (d
13be0 6f 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20  ouble)0 In case 
13bf0 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
13c00 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
13c10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
13c20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
13c30 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
13c40 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
13c50 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
13c60 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
13c70 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
13c80 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
13c90 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
13ca0 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
13cb0 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
13cc0 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
13cd0 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
13ce0 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
13cf0 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
13d00 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
13d10 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
13d20 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
13d30 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13d40 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
13d50 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
13d60 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
13d70 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
13d80 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
13d90 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
13da0 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
13db0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13dc0 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
13dd0 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
13de0 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
13df0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
13e00 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
13e10 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
13e20 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
13e30 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
13e40 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
13e50 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
13e60 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
13e70 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
13e80 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
13e90 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
13ea0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
13eb0 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
13ec0 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
13ed0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13ee0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
13ef0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
13f00 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
13f60 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
13f70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
13f80 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
13f90 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
13fa0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
13fb0 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
13fc0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
13fd0 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65  ssert( (pTerm->e
13fe0 4f 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d  Operator&(pTerm-
13ff0 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d  >eOperator-1))==
14000 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
14010 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
14020 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
14030 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14040 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
14050 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
14060 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
14070 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
14080 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
14090 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  ue;.    pIdxCons
140a0 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54  [j].iColumn = pT
140b0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
140c0 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  n;.    pIdxCons[
140d0 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d  j].iTermOffset =
140e0 20 69 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73   i;.    pIdxCons
140f0 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29 70 54 65  [j].op = (u8)pTe
14100 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  rm->eOperator;. 
14110 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74     /* The direct
14120 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74   assignment in t
14130 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65  he previous line
14140 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c   is possible onl
14150 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  y because.    **
14160 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
14170 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
14180 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
14190 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
141a0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
141b0 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
141c0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
141d0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
141e0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
141f0 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
14200 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54     assert( WO_LT
14210 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14220 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a  ONSTRAINT_LT );.
14230 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
14240 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
14250 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
14260 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14270 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GT==SQLITE_INDEX
14280 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29  _CONSTRAINT_GT )
14290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
142a0 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
142b0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
142c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
142d0 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f  O_MATCH==SQLITE_
142e0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
142f0 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73  _MATCH );.    as
14300 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
14310 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
14320 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
14330 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
14340 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20  ) );.    j++;.  
14350 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
14360 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
14370 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
14380 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14390 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64 78 4f  pExpr;.    pIdxO
143a0 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d  rderBy[i].iColum
143b0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
143c0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  mn;.    pIdxOrde
143d0 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
143e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
143f0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  tOrder;.  }..  r
14400 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
14410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
14420 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
14430 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
14440 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14450 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
14460 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
14470 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
14480 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
14490 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
144a0 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
144b0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
144c0 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
144d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
144e0 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20  ex_info pointer 
144f0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
14500 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
14510 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14520 75 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70  urs, pParse is p
14530 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
14540 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
14550 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  nd a.** non-zero
14560 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
14570 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
14580 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14590 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70   the output.** p
145a0 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74  art of the sqlit
145b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
145c0 72 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20  ructure is left 
145d0 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  populated..**.**
145e0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
145f0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
14600 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20  rned, it is the 
14610 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14620 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
14630 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
14640 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20  ee p->idxStr if 
14650 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
14660 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  Str indicates.**
14670 20 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65   that this is re
14680 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  quired..*/.stati
14690 63 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e  c int vtabBestIn
146a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
146b0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
146c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
146d0 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  fo *p){.  sqlite
146e0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
146f0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
14700 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
14710 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74  b)->pVtab;.  int
14720 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
14730 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
14740 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
14750 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
14760 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
14770 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d  NPUTS(p);.  rc =
14780 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d   pVtab->pModule-
14790 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74 61  >xBestIndex(pVta
147a0 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49  b, p);.  TRACE_I
147b0 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a  DX_OUTPUTS(p);..
147c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
147d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
147e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
147f0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
14800 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
14810 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
14820 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72   if( !pVtab->zEr
14830 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
14840 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14850 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69  arse, "%s", sqli
14860 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a  te3ErrStr(rc));.
14870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14880 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14890 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70  (pParse, "%s", p
148a0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
148b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
148c0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
148d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
148e0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
148f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
14900 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
14910 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  +){.    if( !p->
14920 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
14930 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e  sable && p->aCon
14940 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
14950 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20  argvIndex>0 ){. 
14960 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14980 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
14990 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65  s: xBestIndex re
149a0 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69  turned an invali
149b0 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a  d plan", pTab->z
149c0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
149d0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ..  return pPars
149e0 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  e->nErr;.}.../*.
149f0 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
14a00 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
14a10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
14a20 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e  *.** The best in
14a30 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20  dex is computed 
14a40 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  by the xBestInde
14a50 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  x method of the 
14a60 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
14a70 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72   module.  This r
14a80 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79  outine is really
14a90 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20   just a wrapper 
14aa0 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20  that sets up.** 
14ab0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
14ac0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14ad0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
14ae0 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74   communicate wit
14af0 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e  h.** xBestIndex.
14b00 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e  .**.** In a join
14b10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
14b20 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d  ight be called m
14b30 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f  ultiple times fo
14b40 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69  r the.** same vi
14b50 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
14b60 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14b70 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
14b80 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
14b90 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20   initialized on 
14ba0 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61  the first invoca
14bb0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
14bc0 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  on all subsequen
14bd0 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73  t.** invocations
14be0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
14bf0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14c00 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ure is also used
14c10 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73   when.** code is
14c20 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63   generated to ac
14c30 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c  cess the virtual
14c40 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65   table.  The whe
14c50 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a  reInfoDelete() .
14c60 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73  ** routine takes
14c70 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67   care of freeing
14c80 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
14c90 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14ca0 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79  e after.** every
14cb0 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65  body has finishe
14cc0 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74  d with it..*/.st
14cd0 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 56 69  atic void bestVi
14ce0 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61  rtualIndex(.  Pa
14cf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d10 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
14d20 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
14d30 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
14d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14d50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
14d60 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
14d70 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
14d80 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
14d90 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
14da0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
14db0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
14dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
14dd0 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f 74  k of cursors not
14de0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 69   available for i
14df0 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
14e00 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20  k notValid,     
14e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
14e20 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69 64 20 66  sors not valid f
14e30 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a  or any purpose *
14e40 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
14e50 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
14e60 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
14e70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
14e80 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
14e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ea0 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
14eb0 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 73  uery plan */.  s
14ec0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14ed0 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20 2f  o **ppIdxInfo  /
14ee0 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74  * Index informat
14ef0 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42  ion passed to xB
14f00 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  estIndex */.){. 
14f10 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
14f20 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  Src->pTab;.  sql
14f30 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14f40 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72  *pIdxInfo;.  str
14f50 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14f60 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  x_constraint *pI
14f70 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74  dxCons;.  struct
14f80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14f90 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
14fa0 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
14fb0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
14fc0 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
14fd0 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f 75 62 6c  OrderBy;.  doubl
14fe0 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d  e rCost;..  /* M
14ff0 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67 73  ake sure wsFlags
15000 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
15010 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61 6c  to some sane val
15020 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
15030 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c  f the .  ** mall
15040 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49 6e  oc in allocateIn
15050 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73 20  dexInfo() fails 
15060 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
15070 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69 6e  n returns leavin
15080 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20 69  g.  ** wsFlags i
15090 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
150a0 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63 61  ed state, the ca
150b0 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65 20  ller may behave 
150c0 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a 20  unpredictably.. 
150d0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
150e0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
150f0 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d  Cost));.  pCost-
15100 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20  >plan.wsFlags = 
15110 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
15120 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  LE;..  /* If the
15130 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
15140 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61  nfo structure ha
15150 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69  s not been previ
15160 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ously.  ** alloc
15170 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
15180 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  ized, then alloc
15190 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
151a0 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ze it now..  */.
151b0 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70    pIdxInfo = *pp
151c0 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
151d0 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
151e0 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20 70    *ppIdxInfo = p
151f0 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61  IdxInfo = alloca
15200 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
15210 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70  se, pWC, pSrc, p
15220 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
15230 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
15240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
15250 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
15260 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69   point, the sqli
15270 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
15280 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49  tructure that pI
15290 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20  dxInfo points.  
152a0 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20  ** to will have 
152b0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
152c0 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20  , either during 
152d0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
152e0 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64  cation or.  ** d
152f0 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72  uring some prior
15300 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f   invocation.  No
15310 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74  w we just have t
15320 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a  o customize the.
15330 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
15340 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65  pIdxInfo for the
15350 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
15360 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20  ion and pass it 
15370 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  to.  ** xBestInd
15380 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ex..  */..  /* T
15390 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d  he module name m
153a0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20  ust be defined. 
153b0 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f  Also, by this po
153c0 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20  int there must. 
153d0 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72   ** be a pointer
153e0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
153f0 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f  tab structure. O
15400 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71  therwise.  ** sq
15410 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
15420 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20  mnNames() would 
15430 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74  have picked up t
15440 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a  he error. .  */.
15450 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
15460 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70  azModuleArg && p
15470 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
15480 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [0] );.  assert(
15490 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
154a0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
154b0 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ab) );..  /* Set
154c0 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   the aConstraint
154d0 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73  [].usable fields
154e0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
154f0 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74  all .  ** output
15500 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65   variables to ze
15510 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43  ro..  **.  ** aC
15520 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
15530 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 63  le is true for c
15540 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72 65  onstraints where
15550 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a   the right-hand.
15560 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69    ** side contai
15570 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  ns only referenc
15580 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20  es to tables to 
15590 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
155a0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62  current.  ** tab
155b0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
155c0 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73  rds, if the cons
155d0 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65  traint is of the
155e0 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
155f0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
15600 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20  n = expr.  **.  
15610 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65 76  ** and we are ev
15620 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c  aluating a join,
15630 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
15640 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69  aint on column i
15650 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c  s .  ** only val
15660 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73  id if all tables
15670 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65   referenced in e
15680 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65  xpr occur to the
15690 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68   left.  ** of th
156a0 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
156b0 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a  ng column..  **.
156c0 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72    ** The aConstr
156d0 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f  aints[] array co
156e0 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
156f0 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  or all constrain
15700 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63  ts.  ** on the c
15710 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54  urrent table.  T
15720 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20  hat way we only 
15730 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  have to compute 
15740 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65  it once.  ** eve
15750 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68  n though we migh
15760 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68  t try to pick th
15770 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c  e best index mul
15780 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a  tiple times..  *
15790 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d  * For each attem
157a0 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e  pt at picking an
157b0 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65   index, the orde
157c0 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
157d0 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67  he.  ** join mig
157e0 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ht be different 
157f0 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  so we have to re
15800 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61 62  compute the usab
15810 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63  le flag.  ** eac
15820 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  h time..  */.  p
15830 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
15840 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15850 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
15860 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
15870 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d  aint;.  pUsage =
15880 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
15890 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66  traintUsage;.  f
158a0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
158b0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
158c0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
158d0 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43  ){.    j = pIdxC
158e0 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
158f0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
15900 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49  WC->a[j];.    pI
15910 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
15920 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
15930 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29 20 3f  ight&notReady) ?
15940 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65   0 : 1;.  }.  me
15950 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
15960 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
15970 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )*pIdxInfo->nCon
15980 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20  straint);.  if( 
15990 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
159a0 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
159b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
159c0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  IdxInfo->idxStr)
159d0 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f  ;.  }.  pIdxInfo
159e0 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  ->idxStr = 0;.  
159f0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
15a00 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
15a10 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
15a20 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
15a30 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
15a40 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28  med = 0;.  /* ((
15a50 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61 73  double)2) In cas
15a60 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e of SQLITE_OMIT
15a70 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e  _FLOATING_POINT.
15a80 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .. */.  pIdxInfo
15a90 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
15aa0 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  = SQLITE_BIG_DBL
15ab0 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a   / ((double)2);.
15ac0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
15ad0 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
15ae0 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79  .  if( !pOrderBy
15af0 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
15b00 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->nOrderBy = 0;.
15b10 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62 42    }..  if( vtabB
15b20 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
15b30 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29   pTab, pIdxInfo)
15b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
15b50 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20    }..  pIdxCons 
15b60 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
15b70 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
15b80 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
15b90 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
15ba0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
15bb0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
15bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15bd0 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
15be0 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  dex>0 ){.      p
15bf0 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70 57  Cost->used |= pW
15c00 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d  C->a[pIdxCons[i]
15c10 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72  .iTermOffset].pr
15c20 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 7d  ereqRight;.    }
15c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15c40 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
15c50 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
15c60 68 65 20 73 65 6c 65 63 74 65 64 20 76 69 72 74  he selected virt
15c70 75 61 6c 20 74 61 62 6c 65 20 69 6e 64 65 78 0a  ual table index.
15c80 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61    ** does not sa
15c90 74 69 73 66 79 20 69 74 2c 20 69 6e 63 72 65 61  tisfy it, increa
15ca0 73 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  se the cost of t
15cb0 68 65 20 73 63 61 6e 20 61 63 63 6f 72 64 69 6e  he scan accordin
15cc0 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d  gly. This.  ** m
15cd0 61 74 63 68 65 73 20 74 68 65 20 70 72 6f 63 65  atches the proce
15ce0 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69  ssing for non-vi
15cf0 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 20  rtual tables in 
15d00 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 29  bestBtreeIndex()
15d10 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d  ..  */.  rCost =
15d20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
15d30 61 74 65 64 43 6f 73 74 3b 0a 20 20 69 66 28 20  atedCost;.  if( 
15d40 70 4f 72 64 65 72 42 79 20 26 26 20 70 49 64 78  pOrderBy && pIdx
15d50 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
15d60 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  sumed==0 ){.    
15d70 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28  rCost += estLog(
15d80 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20  rCost)*rCost;.  
15d90 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 73 74  }..  /* The cost
15da0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
15db0 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
15dc0 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
15dd0 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61   (the.  ** inita
15de0 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73  l value of lowes
15df0 74 43 6f 73 74 20 69 6e 20 74 68 69 73 20 6c 6f  tCost in this lo
15e00 6f 70 2e 20 49 66 20 69 74 20 69 73 2c 20 74 68  op. If it is, th
15e10 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73  en the.  ** (cos
15e20 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
15e30 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
15e40 76 65 72 20 62 65 20 74 72 75 65 2e 0a 20 20 2a  ver be true..  *
15e50 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22 28 64 6f  * .  ** Use "(do
15e60 75 62 6c 65 29 32 22 20 69 6e 73 74 65 61 64 20  uble)2" instead 
15e70 6f 66 20 22 32 2e 30 22 20 69 6e 20 63 61 73 65  of "2.0" in case
15e80 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50   OMIT_FLOATING_P
15e90 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73 20 64 65  OINT .  ** is de
15ea0 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  fined..  */.  if
15eb0 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ( (SQLITE_BIG_DB
15ec0 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3c 72  L/((double)2))<r
15ed0 43 6f 73 74 20 29 7b 0a 20 20 20 20 70 43 6f 73  Cost ){.    pCos
15ee0 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49  t->rCost = (SQLI
15ef0 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75  TE_BIG_DBL/((dou
15f00 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65  ble)2));.  }else
15f10 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f  {.    pCost->rCo
15f20 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a  st = rCost;.  }.
15f30 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
15f40 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78 49  pVtabIdx = pIdxI
15f50 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nfo;.  if( pIdxI
15f60 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
15f70 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73  umed ){.    pCos
15f80 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
15f90 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
15fa0 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
15fb0 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  lan.nEq = 0;.  p
15fc0 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
15fd0 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20  y = nOrderBy;.. 
15fe0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
15ff0 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
16000 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
16010 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  by using multipl
16020 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74  e indexes.  ** t
16030 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52  o optimize an OR
16040 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
16050 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
16060 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73  use. .  */.  bes
16070 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
16080 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
16090 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56  , notReady, notV
160a0 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c 20  alid, pOrderBy, 
160b0 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pCost);.}.#endif
160c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
160d0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
160e0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
160f0 70 49 64 78 20 69 73 20 61 20 70 6f 69 6e 74 65  pIdx is a pointe
16100 72 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 73 74  r to an index st
16110 72 75 63 74 75 72 65 20 74 68 61 74 20 68 61 73  ructure that has
16120 20 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20   an array of.** 
16130 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
16140 50 4c 45 53 20 65 76 65 6e 6c 79 20 73 70 61 63  PLES evenly spac
16150 65 64 20 73 61 6d 70 6c 65 73 20 6f 66 20 74 68  ed samples of th
16160 65 20 66 69 72 73 74 20 69 6e 64 65 78 65 64 20  e first indexed 
16170 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64  column.** stored
16180 20 69 6e 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c   in Index.aSampl
16190 65 2e 20 54 68 65 73 65 20 73 61 6d 70 6c 65 73  e. These samples
161a0 20 64 69 76 69 64 65 20 74 68 65 20 64 6f 6d 61   divide the doma
161b0 69 6e 20 6f 66 20 76 61 6c 75 65 73 20 73 74 6f  in of values sto
161c0 72 65 64 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  red.** the index
161d0 20 69 6e 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e   into (SQLITE_IN
161e0 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72  DEX_SAMPLES+1) r
161f0 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f  egions..** Regio
16200 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  n 0 contains all
16210 20 76 61 6c 75 65 73 20 6c 65 73 73 20 74 68 61   values less tha
16220 6e 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  n the first samp
16230 6c 65 20 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e  le value. Region
16240 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e 73 20 76  .** 1 contains v
16250 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 74 68  alues between th
16260 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f  e first and seco
16270 6e 64 20 73 61 6d 70 6c 65 73 2e 20 20 52 65 67  nd samples.  Reg
16280 69 6f 6e 20 32 20 63 6f 6e 74 61 69 6e 73 0a 2a  ion 2 contains.*
16290 2a 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  * values between
162a0 20 73 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   samples 2 and 3
162b0 2e 20 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20 52  .  And so on.  R
162c0 65 67 69 6f 6e 20 53 51 4c 49 54 45 5f 49 4e 44  egion SQLITE_IND
162d0 45 58 5f 53 41 4d 50 4c 45 53 0a 2a 2a 20 63 6f  EX_SAMPLES.** co
162e0 6e 74 61 69 6e 73 20 76 61 6c 75 65 73 20 6c 61  ntains values la
162f0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
16300 73 74 20 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a  st sample..**.**
16310 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   If the index co
16320 6e 74 61 69 6e 73 20 6d 61 6e 79 20 64 75 70 6c  ntains many dupl
16330 69 63 61 74 65 73 20 6f 66 20 61 20 73 69 6e 67  icates of a sing
16340 6c 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 69  le value, then i
16350 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
16360 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72   that two or mor
16370 65 20 61 64 6a 61 63 65 6e 74 20 73 61 6d 70 6c  e adjacent sampl
16380 65 73 20 63 61 6e 20 68 6f 6c 64 20 74 68 65 20  es can hold the 
16390 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 57  same value..** W
163a0 68 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  hen that is the 
163b0 63 61 73 65 2c 20 74 68 65 20 73 6d 61 6c 6c 65  case, the smalle
163c0 73 74 20 70 6f 73 73 69 62 6c 65 20 72 65 67 69  st possible regi
163d0 6f 6e 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  on code is retur
163e0 6e 65 64 0a 2a 2a 20 77 68 65 6e 20 72 6f 75 6e  ned.** when roun
163f0 64 55 70 20 69 73 20 66 61 6c 73 65 20 61 6e 64  dUp is false and
16400 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 6f 73   the largest pos
16410 73 69 62 6c 65 20 72 65 67 69 6f 6e 20 63 6f 64  sible region cod
16420 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
16430 20 77 68 65 6e 20 72 6f 75 6e 64 55 70 20 69 73   when roundUp is
16440 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
16450 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
16460 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
16470 69 6e 65 73 20 77 68 69 63 68 20 6f 66 20 74 68  ines which of th
16480 65 20 72 65 67 69 6f 6e 73 20 76 61 6c 75 65 20  e regions value 
16490 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73 20 69 6e  .** pVal lies in
164a0 2c 20 73 65 74 73 20 2a 70 69 52 65 67 69 6f 6e  , sets *piRegion
164b0 20 74 6f 20 74 68 65 20 72 65 67 69 6f 6e 20 69   to the region i
164c0 6e 64 65 78 20 28 61 20 76 61 6c 75 65 20 62 65  ndex (a value be
164d0 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53  tween 0.** and S
164e0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
164f0 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65  LES+1, inclusive
16500 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  ) and returns SQ
16510 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
16520 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  if an OOM occurs
16530 20 77 68 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e   while convertin
16540 67 20 74 65 78 74 20 76 61 6c 75 65 73 20 62 65  g text values be
16550 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c  tween encodings,
16560 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
16570 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
16580 20 2a 70 69 52 65 67 69 6f 6e 20 69 73 20 75 6e   *piRegion is un
16590 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64  defined..*/.#ifd
165a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
165b0 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e  _STAT2.static in
165c0 74 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  t whereRangeRegi
165d0 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
165e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
165f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
16600 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
16610 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
16620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16630 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
16640 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71  omain of */.  sq
16650 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
16660 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  l,        /* Val
16670 75 65 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a  ue to consider *
16680 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c  /.  int roundUp,
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 2f 2a 20 52 65 74 75 72 6e 20 6c 61 72 67 65 73  /* Return larges
166b0 74 20 76 61 6c 69 64 20 72 65 67 69 6f 6e 20 69  t valid region i
166c0 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
166d0 2a 70 69 52 65 67 69 6f 6e 20 20 20 20 20 20 20  *piRegion       
166e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
166f0 52 65 67 69 6f 6e 20 6f 66 20 64 6f 6d 61 69 6e  Region of domain
16700 20 69 6e 20 77 68 69 63 68 20 76 61 6c 75 65 20   in which value 
16710 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  lies */.){.  ass
16720 65 72 74 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20  ert( roundUp==0 
16730 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b  || roundUp==1 );
16740 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 56  .  if( ALWAYS(pV
16750 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  al) ){.    Index
16760 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
16770 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
16780 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
16790 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
167a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
167b0 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69  pe(pVal);..    i
167c0 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
167d0 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70  _INTEGER || eTyp
167e0 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  e==SQLITE_FLOAT 
167f0 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
16800 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
16810 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a  e_double(pVal);.
16820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16830 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  <SQLITE_INDEX_SA
16840 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20  MPLES; i++){.   
16850 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65       if( aSample
16860 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54  [i].eType==SQLIT
16870 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  E_NULL ) continu
16880 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
16890 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
168a0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
168b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
168c0 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
168d0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
168e0 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29 20 62 72  le[i].u.r>r ) br
168f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
16900 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
16910 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72  ( aSample[i].u.r
16920 3e 3d 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=r ) break;.   
16930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16940 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 79     }else if( eTy
16950 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  pe==SQLITE_NULL 
16960 29 7b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  ){.      i = 0;.
16970 20 20 20 20 20 20 69 66 28 20 72 6f 75 6e 64 55        if( roundU
16980 70 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  p ){.        whi
16990 6c 65 28 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44  le( i<SQLITE_IND
169a0 45 58 5f 53 41 4d 50 4c 45 53 20 26 26 20 61 53  EX_SAMPLES && aS
169b0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  ample[i].eType==
169c0 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 2b  SQLITE_NULL ) i+
169d0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
169e0 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 73 71 6c  else{ .      sql
169f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16a00 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c  e->db;.      Col
16a10 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
16a20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a     const u8 *z;.
16a30 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20        int n;..  
16a40 20 20 20 20 2f 2a 20 70 56 61 6c 20 63 6f 6d 65      /* pVal come
16a50 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 56 61  s from sqlite3Va
16a60 6c 75 65 46 72 6f 6d 45 78 70 72 28 29 20 73 6f  lueFromExpr() so
16a70 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74   the type cannot
16a80 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   be NULL */.    
16a90 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16aa0 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
16ab0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16ac0 4f 42 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  OB );..      if(
16ad0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
16ae0 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  LOB ){.        z
16af0 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73   = (const u8 *)s
16b00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
16b10 62 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  b(pVal);.       
16b20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
16b30 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
16b40 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65  assert( pColl->e
16b50 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
16b60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16b70 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
16b80 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
16b90 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
16ba0 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43  8, 0, *pIdx->azC
16bb0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
16bc0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( pColl==0 ){.  
16bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16be0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16bf0 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
16c00 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22  on sequence: %s"
16c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16c20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 49 64              *pId
16c30 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
16c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16c50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d     }.        z =
16c70 20 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c   (const u8 *)sql
16c80 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
16c90 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  al, pColl->enc);
16ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 20  .        if( !z 
16cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16ce0 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
16cf0 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
16d00 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d  >xCmp );.      }
16d10 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
16d20 65 33 56 61 6c 75 65 42 79 74 65 73 28 70 56 61  e3ValueBytes(pVa
16d30 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  l, pColl->enc);.
16d40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16d50 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  i<SQLITE_INDEX_S
16d60 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20  AMPLES; i++){.  
16d70 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
16d80 20 20 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65       int eSample
16d90 74 79 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69  type = aSample[i
16da0 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].eType;.       
16db0 20 69 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65   if( eSampletype
16dc0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c  ==SQLITE_NULL ||
16dd0 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79   eSampletype<eTy
16de0 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pe ) continue;. 
16df0 20 20 20 20 20 20 20 69 66 28 20 28 65 53 61 6d         if( (eSam
16e00 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65 29 20  pletype!=eType) 
16e10 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66  ) break;.#ifndef
16e20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
16e30 31 36 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  16.        if( p
16e40 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54  Coll->enc!=SQLIT
16e50 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20  E_UTF8 ){.      
16e60 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b      int nSample;
16e70 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
16e80 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74  *zSample = sqlit
16e90 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20  e3Utf8to16(.    
16ea0 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70 43            db, pC
16eb0 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c  oll->enc, aSampl
16ec0 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c  e[i].u.z, aSampl
16ed0 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61  e[i].nByte, &nSa
16ee0 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29  mple.          )
16ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16f00 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  !zSample ){.    
16f10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16f20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16f30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16f50 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
16f60 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
16f70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
16f80 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65  ->pUser, nSample
16f90 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29  , zSample, n, z)
16fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16fb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
16fc0 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  ample);.        
16fd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
16fe0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
16ff0 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70   c = pColl->xCmp
17000 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61  (pColl->pUser, a
17010 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c  Sample[i].nByte,
17020 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
17030 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   n, z);.        
17040 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 2d  }.        if( c-
17050 72 6f 75 6e 64 55 70 3e 3d 30 20 29 20 62 72 65  roundUp>=0 ) bre
17060 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17070 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  }..    assert( i
17080 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c 49 54 45  >=0 && i<=SQLITE
17090 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
170a0 3b 0a 20 20 20 20 2a 70 69 52 65 67 69 6f 6e 20  ;.    *piRegion 
170b0 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
170c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
170d0 65 6e 64 69 66 20 20 20 2f 2a 20 23 69 66 64 65  endif   /* #ifde
170e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
170f0 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT2 */../*.** 
17100 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  If expression pE
17110 78 70 72 20 72 65 70 72 65 73 65 6e 74 73 20 61  xpr represents a
17120 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2c 20   literal value, 
17130 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
17140 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65   to.** an sqlite
17150 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
17160 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17170 20 73 61 6d 65 20 76 61 6c 75 65 2c 20 77 69 74   same value, wit
17180 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66  h affinity.** af
17190 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c  f applied to it,
171a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
171b0 67 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  g. It is the res
171c0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
171d0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  he .** caller to
171e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
171f0 61 73 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ase this structu
17200 72 65 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  re by passing it
17210 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
17220 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  alueFree()..**.*
17230 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
17240 20 70 61 72 73 65 20 69 73 20 61 20 72 65 63 6f   parse is a reco
17250 6d 70 69 6c 65 20 28 73 71 6c 69 74 65 33 52 65  mpile (sqlite3Re
17260 70 72 65 70 61 72 65 28 29 29 20 61 6e 64 20 70  prepare()) and p
17270 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51  Expr.** is an SQ
17280 4c 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  L variable that 
17290 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 20  currently has a 
172a0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62  non-NULL value b
172b0 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63  ound to it,.** c
172c0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  reate an sqlite3
172d0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
172e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
172f0 20 76 61 6c 75 65 2c 20 61 67 61 69 6e 20 77 69   value, again wi
17300 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 61  th.** affinity a
17310 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20 69 74  ff applied to it
17320 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  , instead..**.**
17330 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
17340 68 65 20 61 62 6f 76 65 20 61 70 70 6c 79 2c 20  he above apply, 
17350 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e  set *pp to NULL.
17360 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
17370 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
17380 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
17390 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
173a0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66  TE_OK..*/.#ifdef
173b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
173c0 54 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT2.static int 
173d0 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
173e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
173f0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
17400 0a 20 20 75 38 20 61 66 66 2c 20 0a 20 20 73 71  .  u8 aff, .  sq
17410 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
17420 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  .){.  if( pExpr-
17430 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  >op==TK_VARIABLE
17440 0a 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f  .   || (pExpr->o
17450 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
17460 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  & pExpr->op2==TK
17470 5f 56 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a  _VARIABLE).  ){.
17480 20 20 20 20 69 6e 74 20 69 56 61 72 20 3d 20 70      int iVar = p
17490 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
174a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
174b0 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
174c0 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 20 2f  >pVdbe, iVar); /
174d0 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30  * IMP: R-23257-0
174e0 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a 70 70 20  2778 */.    *pp 
174f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
17500 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52  Value(pParse->pR
17510 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20  eprepare, iVar, 
17520 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  aff);.    return
17530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17540 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17550 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
17560 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
17570 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66   SQLITE_UTF8, af
17580 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  f, pp);.}.#endif
17590 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
175a0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
175b0 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
175c0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
175d0 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65  t will be visite
175e0 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67  d.** by scanning
175f0 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20   an index for a 
17600 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e  range of values.
17610 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68   The range may h
17620 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20  ave an upper.** 
17630 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62  bound, a lower b
17640 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54  ound, or both. T
17650 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17660 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20 74  terms that set t
17670 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20  he upper.** and 
17680 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65  lower bounds are
17690 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
176a0 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
176b0 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  r respectively. 
176c0 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
176d0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e  assuming that in
176e0 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61  dex p is on t1(a
176f0 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  ):.**.**   ... F
17700 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
17710 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
17720 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17730 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20         |_____|  
17740 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20   |_____|.**     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a    |         |.**
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70       pLower    p
17790 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Upper.**.** If e
177a0 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70 70  ither of the upp
177b0 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
177c0 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  d is not present
177d0 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70  , then NULL is p
177e0 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63  assed in.** plac
177f0 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  e of the corresp
17800 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d  onding WhereTerm
17810 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20  ..**.** The nEq 
17820 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
17830 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  sed the index of
17840 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
17850 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
17860 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  .** range constr
17870 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61  aint. Or, equiva
17880 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62  lently, the numb
17890 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
178a0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70  onstraints.** op
178b0 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70  timized by the p
178c0 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63  roposed index sc
178d0 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  an. For example,
178e0 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
178f0 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c  p is.** on t1(a,
17900 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c   b), and the SQL
17910 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a   query is:.**.**
17920 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57     ... FROM t1 W
17930 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62  HERE a = ? AND b
17940 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e   > ? AND b < ? .
17950 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
17960 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  q should be pass
17970 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20 28  ed the value 1 (
17980 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65 73  as the range res
17990 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a  tricted column,.
179a0 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65 63  ** b, is the sec
179b0 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  ond left-most co
179c0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
179d0 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71  x). Or, if the q
179e0 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
179f0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
17a00 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c  RE a > ? AND a <
17a10 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65   ? ....**.** the
17a20 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20  n nEq should be 
17a30 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20  passed 0..**.** 
17a40 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
17a50 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
17a60 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 31   between 1 and 1
17a70 30 30 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 41  00, inclusive. A
17a80 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65   return.** value
17a90 20 6f 66 20 31 20 69 6e 64 69 63 61 74 65 73 20   of 1 indicates 
17aa0 74 68 61 74 20 74 68 65 20 70 72 6f 70 6f 73 65  that the propose
17ab0 64 20 72 61 6e 67 65 20 73 63 61 6e 20 69 73 20  d range scan is 
17ac0 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73 69  expected to visi
17ad0 74 0a 2a 2a 20 61 70 70 72 6f 78 69 6d 61 74 65  t.** approximate
17ae0 6c 79 20 31 2f 31 30 30 74 68 20 28 31 25 29 20  ly 1/100th (1%) 
17af0 6f 66 20 74 68 65 20 72 6f 77 73 20 73 65 6c 65  of the rows sele
17b00 63 74 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  cted by the nEq 
17b10 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
17b20 74 72 61 69 6e 74 73 20 28 69 66 20 61 6e 79 29  traints (if any)
17b30 2e 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65  . A return value
17b40 20 6f 66 20 31 30 30 20 69 6e 64 69 63 61 74 65   of 100 indicate
17b50 73 20 74 68 61 74 20 69 74 20 69 73 20 65 78 70  s that it is exp
17b60 65 63 74 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  ected.** that th
17b70 65 20 72 61 6e 67 65 20 73 63 61 6e 20 77 69 6c  e range scan wil
17b80 6c 20 76 69 73 69 74 20 65 76 65 72 79 20 72 6f  l visit every ro
17b90 77 20 28 31 30 30 25 29 20 73 65 6c 65 63 74 65  w (100%) selecte
17ba0 64 20 62 79 20 74 68 65 20 65 71 75 61 6c 69 74  d by the equalit
17bb0 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73  y.** constraints
17bc0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
17bd0 62 73 65 6e 63 65 20 6f 66 20 73 71 6c 69 74 65  bsence of sqlite
17be0 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64  _stat2 ANALYZE d
17bf0 61 74 61 2c 20 65 61 63 68 20 72 61 6e 67 65 20  ata, each range 
17c00 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65  inequality.** re
17c10 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
17c20 20 73 70 61 63 65 20 62 79 20 33 2f 34 74 68 73   space by 3/4ths
17c30 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67 6c  .  Hence a singl
17c40 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
17c50 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  ?).** results in
17c60 20 61 20 72 65 74 75 72 6e 20 6f 66 20 32 35 20   a return of 25 
17c70 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73  and a range cons
17c80 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20  traint (x>? AND 
17c90 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20  x<?) results.** 
17ca0 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 36  in a return of 6
17cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17cc0 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
17cd0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
17ce0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17cf0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
17d00 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17d10 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17d30 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67  index containing
17d40 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
17d50 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20  red column; "x" 
17d60 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20  */.  int nEq,   
17d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64            /* ind
17d80 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b  ex into p->aCol[
17d90 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63  ] of the range-c
17da0 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a  ompared column *
17db0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
17dc0 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
17dd0 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
17de0 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
17df0 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
17e00 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
17e10 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
17e20 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
17e30 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
17e40 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
17e50 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 73 74   */.  int *piEst
17e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
17e70 54 3a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  T: Return value 
17e80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
17e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
17ea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17eb0 45 5f 53 54 41 54 32 0a 0a 20 20 69 66 28 20 6e  E_STAT2..  if( n
17ec0 45 71 3d 3d 30 20 26 26 20 70 2d 3e 61 53 61 6d  Eq==0 && p->aSam
17ed0 70 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ple ){.    sqlit
17ee0 65 33 5f 76 61 6c 75 65 20 2a 70 4c 6f 77 65 72  e3_value *pLower
17ef0 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Val = 0;.    sql
17f00 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 55 70 70  ite3_value *pUpp
17f10 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69  erVal = 0;.    i
17f20 6e 74 20 69 45 73 74 3b 0a 20 20 20 20 69 6e 74  nt iEst;.    int
17f30 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
17f40 20 69 6e 74 20 69 55 70 70 65 72 20 3d 20 53 51   int iUpper = SQ
17f50 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
17f60 45 53 3b 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e  ES;.    int roun
17f70 64 55 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20  dUpUpper = 0;.  
17f80 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 4c 6f 77    int roundUpLow
17f90 65 72 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 61  er = 0;.    u8 a
17fa0 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  ff = p->pTable->
17fb0 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e  aCol[p->aiColumn
17fc0 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a  [0]].affinity;..
17fd0 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29      if( pLower )
17fe0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
17ff0 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45  xpr = pLower->pE
18000 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
18010 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
18020 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  mExpr(pParse, pE
18030 78 70 72 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65  xpr, aff, &pLowe
18040 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  rVal);.      ass
18050 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70  ert( pLower->eOp
18060 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c  erator==WO_GT ||
18070 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74   pLower->eOperat
18080 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20  or==WO_GE );.   
18090 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 20     roundUpLower 
180a0 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  = (pLower->eOper
180b0 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20 3f 31 3a  ator==WO_GT) ?1:
180c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
180d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
180e0 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  & pUpper ){.    
180f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
18100 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pUpper->pExpr->p
18110 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
18120 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
18130 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
18140 66 66 2c 20 26 70 55 70 70 65 72 56 61 6c 29 3b  ff, &pUpperVal);
18150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18160 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
18170 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65  ==WO_LT || pUppe
18180 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  r->eOperator==WO
18190 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 72 6f 75  _LE );.      rou
181a0 6e 64 55 70 55 70 70 65 72 20 3d 20 28 70 55 70  ndUpUpper = (pUp
181b0 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  per->eOperator==
181c0 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a 20 20 20  WO_LE) ?1:0;.   
181d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
181e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c  SQLITE_OK || (pL
181f0 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20 70 55  owerVal==0 && pU
18200 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20  pperVal==0) ){. 
18210 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
18220 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c 29  eFree(pLowerVal)
18230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18240 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72 56  alueFree(pUpperV
18250 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  al);.      goto 
18260 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61  range_est_fallba
18270 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ck;.    }else if
18280 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29  ( pLowerVal==0 )
18290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
182a0 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
182b0 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72 56  arse, p, pUpperV
182c0 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70 70 65 72  al, roundUpUpper
182d0 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20  , &iUpper);.    
182e0 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 20 69    if( pLower ) i
182f0 4c 6f 77 65 72 20 3d 20 69 55 70 70 65 72 2f 32  Lower = iUpper/2
18300 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18310 70 55 70 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a  pUpperVal==0 ){.
18320 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
18330 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72  RangeRegion(pPar
18340 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c  se, p, pLowerVal
18350 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20  , roundUpLower, 
18360 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20  &iLower);.      
18370 69 66 28 20 70 55 70 70 65 72 20 29 20 69 55 70  if( pUpper ) iUp
18380 70 65 72 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20  per = (iLower + 
18390 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
183a0 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20  PLES + 1)/2;.   
183b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
183c0 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67   = whereRangeReg
183d0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ion(pParse, p, p
183e0 55 70 70 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55  UpperVal, roundU
183f0 70 55 70 70 65 72 2c 20 26 69 55 70 70 65 72 29  pUpper, &iUpper)
18400 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18420 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
18430 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
18440 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c  e, p, pLowerVal,
18450 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26   roundUpLower, &
18460 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
18470 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
18480 54 52 41 43 45 28 28 22 72 61 6e 67 65 20 73 63  TRACE(("range sc
18490 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e  an regions: %d..
184a0 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69  %d\n", iLower, i
184b0 55 70 70 65 72 29 29 3b 0a 0a 20 20 20 20 69 45  Upper));..    iE
184c0 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  st = iUpper - iL
184d0 6f 77 65 72 3b 0a 20 20 20 20 74 65 73 74 63 61  ower;.    testca
184e0 73 65 28 20 69 45 73 74 3d 3d 53 51 4c 49 54 45  se( iEst==SQLITE
184f0 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29  _INDEX_SAMPLES )
18500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 45  ;.    assert( iE
18510 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  st<=SQLITE_INDEX
18520 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20  _SAMPLES );.    
18530 69 66 28 20 69 45 73 74 3c 31 20 29 7b 0a 20 20  if( iEst<1 ){.  
18540 20 20 20 20 2a 70 69 45 73 74 20 3d 20 35 30 2f      *piEst = 50/
18550 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
18560 50 4c 45 53 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  PLES;.    }else{
18570 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20  .      *piEst = 
18580 28 69 45 73 74 2a 31 30 30 29 2f 53 51 4c 49 54  (iEst*100)/SQLIT
18590 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
185a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
185b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 6f 77  e3ValueFree(pLow
185c0 65 72 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  erVal);.    sqli
185d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70  te3ValueFree(pUp
185e0 70 65 72 56 61 6c 29 3b 0a 20 20 20 20 72 65 74  perVal);.    ret
185f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67  urn rc;.  }.rang
18600 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a  e_est_fallback:.
18610 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
18620 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
18630 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
18640 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45  ETER(p);.  UNUSE
18650 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29  D_PARAMETER(nEq)
18660 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
18670 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
18680 70 65 72 20 29 3b 0a 20 20 2a 70 69 45 73 74 20  per );.  *piEst 
18690 3d 20 31 30 30 3b 0a 20 20 69 66 28 20 70 4c 6f  = 100;.  if( pLo
186a0 77 65 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e  wer && (pLower->
186b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
186c0 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70 69 45 73  NULL)==0 ) *piEs
186d0 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28 20 70 55  t /= 4;.  if( pU
186e0 70 70 65 72 20 29 20 2a 70 69 45 73 74 20 2f 3d  pper ) *piEst /=
186f0 20 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   4;.  return rc;
18700 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
18710 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f  E_ENABLE_STAT2./
18720 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
18730 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
18740 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
18750 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
18760 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63  ** an equality c
18770 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55  onstraint x=VALU
18780 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74  E and where that
18790 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e   VALUE occurs in
187a0 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61  .** the histogra
187b0 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e  m data.  This on
187c0 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20  ly works when x 
187d0 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  is the left-most
187e0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  .** column of an
187f0 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74   index and sqlit
18800 65 5f 73 74 61 74 32 20 68 69 73 74 6f 67 72 61  e_stat2 histogra
18810 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61  m data is availa
18820 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20  ble.** for that 
18830 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78  index.  When pEx
18840 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  pr==NULL that me
18850 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ans the constrai
18860 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e  nt is.** "x IS N
18870 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ULL" instead of 
18880 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a  "x=VALUE"..**.**
18890 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
188a0 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
188b0 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
188c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
188d0 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
188e0 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
188f0 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
18900 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
18910 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
18920 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
18930 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
18940 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
18950 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
18960 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
18970 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
18980 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
18990 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
189a0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
189b0 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
189c0 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
189d0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
189e0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
189f0 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
18a00 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
18a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18a20 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
18a30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18a40 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
18a50 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
18a60 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
18a70 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  .  Index *p,    
18a80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
18a90 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74 2d  ndex whose left-
18aa0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70  most column is p
18ab0 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  Term */.  Expr *
18ac0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f  pExpr,         /
18ad0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
18ae0 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d   VALUE in the x=
18af0 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  VALUE constraint
18b00 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e   */.  double *pn
18b10 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72  Row        /* Wr
18b20 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
18b30 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
18b40 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
18b50 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d 20  3_value *pRhs = 
18b60 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20  0;  /* VALUE on 
18b70 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
18b80 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e  of pTerm */.  in
18b90 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72  t iLower, iUpper
18ba0 3b 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65  ;       /* Range
18bb0 20 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65   of histogram re
18bc0 67 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67  gions containing
18bd0 20 70 52 68 73 20 2a 2f 0a 20 20 75 38 20 61 66   pRhs */.  u8 af
18be0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
18bf0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61       /* Column a
18c00 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74  ffinity */.  int
18c10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18c20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e         /* Subfun
18c30 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
18c40 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52  e */.  double nR
18c50 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20 20  owEst;          
18c60 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65   /* New estimate
18c70 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
18c80 66 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 61 73 73  f rows */..  ass
18c90 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
18ca0 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d  =0 );.  aff = p-
18cb0 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d  >pTable->aCol[p-
18cc0 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66  >aiColumn[0]].af
18cd0 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20 70 45  finity;.  if( pE
18ce0 78 70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  xpr ){.    rc = 
18cf0 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
18d00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
18d10 2c 20 26 70 52 68 73 29 3b 0a 20 20 20 20 69 66  , &pRhs);.    if
18d20 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
18d30 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
18d40 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ncel;.  }else{. 
18d50 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
18d60 33 56 61 6c 75 65 4e 65 77 28 70 50 61 72 73 65  3ValueNew(pParse
18d70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->db);.  }.  if(
18d80 20 70 52 68 73 3d 3d 30 20 29 20 72 65 74 75 72   pRhs==0 ) retur
18d90 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
18da0 44 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52  D;.  rc = whereR
18db0 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
18dc0 65 2c 20 70 2c 20 70 52 68 73 2c 20 30 2c 20 26  e, p, pRhs, 0, &
18dd0 69 4c 6f 77 65 72 29 3b 0a 20 20 69 66 28 20 72  iLower);.  if( r
18de0 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
18df0 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
18e00 6c 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 52  l;.  rc = whereR
18e10 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
18e20 65 2c 20 70 2c 20 70 52 68 73 2c 20 31 2c 20 26  e, p, pRhs, 1, &
18e30 69 55 70 70 65 72 29 3b 0a 20 20 69 66 28 20 72  iUpper);.  if( r
18e40 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
18e50 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
18e60 6c 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  l;.  WHERETRACE(
18e70 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
18e80 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c  regions: %d..%d\
18e90 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  n", iLower, iUpp
18ea0 65 72 29 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77  er));.  if( iLow
18eb0 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20  er>=iUpper ){.  
18ec0 20 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61    nRowEst = p->a
18ed0 69 52 6f 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49  iRowEst[0]/(SQLI
18ee0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
18ef0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  *2);.    if( nRo
18f00 77 45 73 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70  wEst<*pnRow ) *p
18f10 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
18f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f    }else{.    nRo
18f30 77 45 73 74 20 3d 20 28 69 55 70 70 65 72 2d 69  wEst = (iUpper-i
18f40 4c 6f 77 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45  Lower)*p->aiRowE
18f50 73 74 5b 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44  st[0]/SQLITE_IND
18f60 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20  EX_SAMPLES;.    
18f70 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
18f80 3b 0a 20 20 7d 0a 0a 77 68 65 72 65 45 71 75 61  ;.  }..whereEqua
18f90 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a  lScanEst_cancel:
18fa0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
18fb0 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72 65 74  ree(pRhs);.  ret
18fc0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18fd0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
18fe0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29  TE_ENABLE_STAT2)
18ff0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
19000 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
19010 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
19020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
19030 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
19040 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
19050 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  .** an IN constr
19060 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72  aint where the r
19070 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19080 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
19090 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f  r.** is a list o
190a0 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70  f values.  Examp
190b0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
190c0 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
190d0 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ,3,4).**.** Writ
190e0 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  e the estimated 
190f0 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a  row count into *
19100 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  pnRow and return
19110 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20   SQLITE_OK. .** 
19120 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b  If unable to mak
19130 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c  e an estimate, l
19140 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68  eave *pnRow unch
19150 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e  anged and return
19160 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  .** non-zero..**
19170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19180 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20   can fail if it 
19190 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61  is unable to loa
191a0 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  d a collating se
191b0 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72  quence.** requir
191c0 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f  ed for string co
191d0 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20  mparison, or if 
191e0 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
191f0 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  te memory.** for
19200 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f   a UTF conversio
19210 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  n required for c
19220 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20  omparison.  The 
19230 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a  error is stored.
19240 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  ** in the pParse
19250 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
19260 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49  tatic int whereI
19270 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  nScanEst(.  Pars
19280 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
19290 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
192a0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
192b0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
192c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
192d0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f  /* The index who
192e0 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  se left-most col
192f0 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a  umn is pTerm */.
19300 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19310 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
19320 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
19330 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
19340 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
19350 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20    double *pnRow 
19360 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19370 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
19380 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
19390 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  .){.  sqlite3_va
193a0 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
193b0 2f 2a 20 4f 6e 65 20 76 61 6c 75 65 20 66 72 6f  /* One value fro
193c0 6d 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  m list */.  int 
193d0 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20  iLower, iUpper; 
193e0 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f        /* Range o
193f0 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69  f histogram regi
19400 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ons containing p
19410 52 68 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b  Rhs */.  u8 aff;
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66     /* Column aff
19440 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72  inity */.  int r
19450 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
19460 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74       /* Subfunct
19470 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ion return code 
19480 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  */.  double nRow
19490 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
194a0 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f  * New estimate o
194b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
194c0 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rows */.  int nS
194d0 70 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pan = 0;        
194e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
194f0 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f   histogram regio
19500 6e 73 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20  ns spanned */.  
19510 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b  int nSingle = 0;
19520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 73            /* His
19530 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20 68  togram regions h
19540 69 74 20 62 79 20 61 20 73 69 6e 67 6c 65 20 76  it by a single v
19550 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  alue */.  int nN
19560 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20  otFound = 0;    
19570 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20      /* Count of 
19580 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
19590 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  not constants */
195a0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
195d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
195e0 61 53 70 61 6e 5b 53 51 4c 49 54 45 5f 49 4e 44  aSpan[SQLITE_IND
195f0 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20  EX_SAMPLES+1];  
19600 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72    /* Histogram r
19610 65 67 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  egions that are 
19620 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20 75 38 20  spanned */.  u8 
19630 61 53 69 6e 67 6c 65 5b 53 51 4c 49 54 45 5f 49  aSingle[SQLITE_I
19640 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b  NDEX_SAMPLES+1];
19650 20 20 2f 2a 20 48 69 73 74 6f 67 72 61 6d 20 72    /* Histogram r
19660 65 67 69 6f 6e 73 20 68 69 74 20 6f 6e 63 65 20  egions hit once 
19670 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
19680 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
19690 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
196a0 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
196b0 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
196c0 0a 20 20 6d 65 6d 73 65 74 28 61 53 70 61 6e 2c  .  memset(aSpan,
196d0 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 6e   0, sizeof(aSpan
196e0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 69  ));.  memset(aSi
196f0 6e 67 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ngle, 0, sizeof(
19700 61 53 69 6e 67 6c 65 29 29 3b 0a 20 20 66 6f 72  aSingle));.  for
19710 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
19720 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
19730 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19740 28 70 56 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (pVal);.    rc =
19750 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70   valueFromExpr(p
19760 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
19770 69 5d 2e 70 45 78 70 72 2c 20 61 66 66 2c 20 26  i].pExpr, aff, &
19780 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  pVal);.    if( r
19790 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  c ) break;.    i
197a0 66 28 20 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71  f( pVal==0 || sq
197b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
197c0 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e  (pVal)==SQLITE_N
197d0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6e 4e 6f  ULL ){.      nNo
197e0 74 46 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20  tFound++;.      
197f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
19800 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
19810 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65  ngeRegion(pParse
19820 2c 20 70 2c 20 70 56 61 6c 2c 20 30 2c 20 26 69  , p, pVal, 0, &i
19830 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
19840 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
19850 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 52  rc = whereRangeR
19860 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c  egion(pParse, p,
19870 20 70 56 61 6c 2c 20 31 2c 20 26 69 55 70 70 65   pVal, 1, &iUppe
19880 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  r);.    if( rc )
19890 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
198a0 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29  iLower>=iUpper )
198b0 7b 0a 20 20 20 20 20 20 61 53 69 6e 67 6c 65 5b  {.      aSingle[
198c0 69 4c 6f 77 65 72 5d 20 3d 20 31 3b 0a 20 20 20  iLower] = 1;.   
198d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
198e0 73 65 72 74 28 20 69 4c 6f 77 65 72 3e 3d 30 20  sert( iLower>=0 
198f0 26 26 20 69 55 70 70 65 72 3c 3d 53 51 4c 49 54  && iUpper<=SQLIT
19900 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
19910 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
19920 69 4c 6f 77 65 72 3c 69 55 70 70 65 72 20 29 20  iLower<iUpper ) 
19930 61 53 70 61 6e 5b 69 4c 6f 77 65 72 2b 2b 5d 20  aSpan[iLower++] 
19940 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
19950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19960 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  OK ){.    for(i=
19970 6e 53 70 61 6e 3d 30 3b 20 69 3c 3d 53 51 4c 49  nSpan=0; i<=SQLI
19980 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
19990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
199a0 28 20 61 53 70 61 6e 5b 69 5d 20 29 7b 0a 20 20  ( aSpan[i] ){.  
199b0 20 20 20 20 20 20 6e 53 70 61 6e 2b 2b 3b 0a 20        nSpan++;. 
199c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
199d0 53 69 6e 67 6c 65 5b 69 5d 20 29 7b 0a 20 20 20  Single[i] ){.   
199e0 20 20 20 20 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a       nSingle++;.
199f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19a00 20 20 6e 52 6f 77 45 73 74 20 3d 20 28 6e 53 70    nRowEst = (nSp
19a10 61 6e 2a 32 2b 6e 53 69 6e 67 6c 65 29 2a 70 2d  an*2+nSingle)*p-
19a20 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 32 2a  >aiRowEst[0]/(2*
19a30 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
19a40 50 4c 45 53 29 0a 20 20 20 20 20 20 20 20 20 20  PLES).          
19a50 20 20 20 20 20 2b 20 6e 4e 6f 74 46 6f 75 6e 64       + nNotFound
19a60 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b 31 5d 3b  *p->aiRowEst[1];
19a70 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
19a80 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30   > p->aiRowEst[0
19a90 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d  ] ) nRowEst = p-
19aa0 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20  >aiRowEst[0];.  
19ab0 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45    *pnRow = nRowE
19ac0 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  st;.    WHERETRA
19ad0 43 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69  CE(("IN row esti
19ae0 6d 61 74 65 3a 20 6e 53 70 61 6e 3d 25 64 2c 20  mate: nSpan=%d, 
19af0 6e 53 69 6e 67 6c 65 3d 25 64 2c 20 6e 4e 6f 74  nSingle=%d, nNot
19b00 46 6f 75 6e 64 3d 25 64 2c 20 65 73 74 3d 25 67  Found=%d, est=%g
19b10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19b20 20 20 20 20 20 20 6e 53 70 61 6e 2c 20 6e 53 69        nSpan, nSi
19b30 6e 67 6c 65 2c 20 6e 4e 6f 74 46 6f 75 6e 64 2c  ngle, nNotFound,
19b40 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a   nRowEst));.  }.
19b50 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
19b60 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
19b70 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
19b80 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
19b90 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20  E_ENABLE_STAT2) 
19ba0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  */.../*.** Find 
19bb0 74 68 65 20 62 65 73 74 20 71 75 65 72 79 20 70  the best query p
19bc0 6c 61 6e 20 66 6f 72 20 61 63 63 65 73 73 69 6e  lan for accessin
19bd0 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  g a particular t
19be0 61 62 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  able.  Write the
19bf0 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20 70  .** best query p
19c00 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73 74  lan and its cost
19c10 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 43   into the WhereC
19c20 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70 6c  ost object suppl
19c30 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61  ied as the.** la
19c40 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  st parameter..**
19c50 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63  .** The lowest c
19c60 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20  ost plan wins.  
19c70 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65  The cost is an e
19c80 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61  stimate of the a
19c90 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20  mount of.** CPU 
19ca0 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65  and disk I/O nee
19cb0 64 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ded to process t
19cc0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 73  he requested res
19cd0 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  ult..** Factors 
19ce0 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
19cf0 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
19d00 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
19d10 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
19d20 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
19d30 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
19d40 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
19d50 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
19d60 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
19d70 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
19d80 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
19d90 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
19da0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
19db0 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
19dc0 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
19dd0 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
19de0 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
19df0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
19e00 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
19e10 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 28 70  XED BY clause (p
19e20 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61 74 74  Src->pIndex) att
19e30 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61 62  ached to the tab
19e40 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c  le in.** the SQL
19e50 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
19e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   this function o
19e70 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20 70 6c  nly considers pl
19e80 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  ans using the .*
19e90 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 49  * named index. I
19ea0 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e 20 69  f no such plan i
19eb0 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  s found, then th
19ec0 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20  e returned cost 
19ed0 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47  is.** SQLITE_BIG
19ee0 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20  _DBL. If a plan 
19ef0 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 75 73  is found that us
19f00 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  es the named ind
19f10 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ex, .** then the
19f20 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75 6c 61   cost is calcula
19f30 74 65 64 20 69 6e 20 74 68 65 20 75 73 75 61 6c  ted in the usual
19f40 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
19f50 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
19f60 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e  use (pSrc->notIn
19f70 64 65 78 65 64 21 3d 30 29 20 77 61 73 20 61 74  dexed!=0) was at
19f80 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 61  tached to the ta
19f90 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53  ble .** in the S
19fa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
19fb0 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73   then no indexes
19fc0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
19fd0 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 0a 2a   However, the .*
19fe0 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 20  * selected plan 
19ff0 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65 20 61  may still take a
1a000 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
1a010 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70  built-in rowid p
1a020 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e  rimary key.** in
1a030 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1a040 6f 69 64 20 62 65 73 74 42 74 72 65 65 49 6e 64  oid bestBtreeInd
1a050 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
1a060 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
1a070 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1a080 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1a090 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
1a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a0b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1a0c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1a0d0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
1a0e0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1a0f0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1a100 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
1a110 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
1a120 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
1a130 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
1a140 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
1a150 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1a160 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
1a170 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
1a180 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
1a190 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
1a1a0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1a1b0 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
1a1c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a1d0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1a1e0 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  *pDistinct,     
1a1f0 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74     /* The select
1a200 2d 6c 69 73 74 20 69 66 20 71 75 65 72 79 20 69  -list if query i
1a210 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
1a220 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
1a230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1a240 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
1a250 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e   plan */.){.  in
1a260 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69  t iCur = pSrc->i
1a270 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65  Cursor;   /* The
1a280 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74   cursor of the t
1a290 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73  able to be acces
1a2a0 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  sed */.  Index *
1a2b0 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20  pProbe;         
1a2c0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1a2d0 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69   we are evaluati
1a2e0 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ng */.  Index *p
1a2f0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1a300 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
1a310 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66  Probe, or zero f
1a320 6f 72 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a  or IPK index */.
1a330 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
1a340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a350 20 43 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66   Current mask of
1a360 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
1a370 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
1a380 6e 74 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b  nt idxEqTermMask
1a390 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
1a3a0 64 65 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69  dex mask of vali
1a3b0 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61  d equality opera
1a3c0 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tors */.  Index 
1a3d0 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
1a3e0 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
1a3f0 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
1a400 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
1a410 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
1a420 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
1a430 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73  ; /* The aiRowEs
1a440 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
1a450 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
1a460 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   int aiColumnPk 
1a470 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
1a480 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
1a490 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
1a4a0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77  index */.  int w
1a4b0 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20  sFlagMask;      
1a4c0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65         /* Allowe
1a4d0 64 20 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74  d flags in pCost
1a4e0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f  ->plan.wsFlag */
1a4f0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1a500 65 20 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20  e the cost to a 
1a510 77 6f 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65  worst-case value
1a520 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f   */.  memset(pCo
1a530 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  st, 0, sizeof(*p
1a540 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d  Cost));.  pCost-
1a550 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  >rCost = SQLITE_
1a560 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49  BIG_DBL;..  /* I
1a570 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c 65  f the pSrc table
1a580 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
1a590 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ble of a LEFT JO
1a5a0 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e  IN then we may n
1a5b0 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69  ot.  ** use an i
1a5c0 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79 20  ndex to satisfy 
1a5d0 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  IS NULL constrai
1a5e0 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c  nts on that tabl
1a5f0 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a  e.  This is.  **
1a600 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73   because columns
1a610 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
1a620 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  ing NULL if the 
1a630 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d  table does not m
1a640 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69  atch -.  ** a ci
1a650 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68  rcumstance which
1a660 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
1a670 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76  t help us discov
1a680 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37  er.  Ticket #217
1a690 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  7..  */.  if( pS
1a6a0 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rc->jointype & J
1a6b0 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64  T_LEFT ){.    id
1a6c0 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f  xEqTermMask = WO
1a6d0 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  _EQ|WO_IN;.  }el
1a6e0 73 65 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72  se{.    idxEqTer
1a6f0 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
1a700 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  _IN|WO_ISNULL;. 
1a710 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   }..  if( pSrc->
1a720 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
1a730 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
1a740 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
1a750 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1a760 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
1a770 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d   pIdx = pProbe =
1a780 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20   pSrc->pIndex;. 
1a790 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20     wsFlagMask = 
1a7a0 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  ~(WHERE_ROWID_EQ
1a7b0 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
1a7c0 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d  GE);.    eqTermM
1a7d0 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d  ask = idxEqTermM
1a7e0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1a7f0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
1a800 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a810 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
1a820 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
1a830 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
1a840 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
1a850 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
1a860 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
1a870 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
1a880 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
1a890 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
1a8a0 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
1a8b0 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
1a8c0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
1a8d0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
1a8e0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
1a8f0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a910 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
1a920 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
1a930 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
1a940 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
1a950 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
1a960 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
1a970 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
1a980 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
1a990 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
1a9a0 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
1a9b0 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
1a9c0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
1a9d0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
1a9e0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
1a9f0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
1aa00 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
1aa10 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
1aa20 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
1aa30 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
1aa40 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1aa50 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
1aa60 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
1aa70 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
1aa80 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
1aa90 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
1aaa0 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
1aab0 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
1aac0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
1aad0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
1aae0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1aaf0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
1ab00 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
1ab10 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
1ab20 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
1ab30 20 3d 20 7e 28 0a 20 20 20 20 20 20 20 20 57 48   = ~(.        WH
1ab40 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1ab50 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
1ab60 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c  ERE_COLUMN_NULL|
1ab70 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1ab80 47 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 65 71  GE.    );.    eq
1ab90 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
1aba0 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78  |WO_IN;.    pIdx
1abb0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1abc0 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
1abd0 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  dices looking fo
1abe0 72 20 74 68 65 20 62 65 73 74 20 6f 6e 65 20 74  r the best one t
1abf0 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  o use.  */.  for
1ac00 28 3b 20 70 50 72 6f 62 65 3b 20 70 49 64 78 3d  (; pProbe; pIdx=
1ac10 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
1ac20 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Next){.    const
1ac30 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 20   unsigned int * 
1ac40 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d  const aiRowEst =
1ac50 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
1ac60 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  t;.    double co
1ac70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1ac80 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
1ac90 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
1aca0 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1acc0 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
1acd0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
1ace0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64  ult set */.    d
1acf0 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 3b 20 20 20  ouble log10N;   
1ad00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 61             /* ba
1ad10 73 65 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20  se-10 logarithm 
1ad20 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74  of nRow (inexact
1ad30 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76  ) */.    int rev
1ad40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ad50 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1ad60 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1ad70 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
1ad80 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
1ad90 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
1ada0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   0;..    /* The 
1adb0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1adc0 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
1add0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70  d based on the p
1ade0 72 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20  roperties of.   
1adf0 20 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20   ** index being 
1ae00 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20  evaluated. They 
1ae10 61 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f  are then used to
1ae20 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
1ae30 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63  xpected.    ** c
1ae40 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ost and number o
1ae50 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e  f rows returned.
1ae60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ae70 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
1ae80 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1ae90 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
1aea0 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
1aeb0 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1aec0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
1aed0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1aee0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
1aef0 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
1af00 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
1af10 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
1af20 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
1af30 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1af40 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
1af50 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
1af60 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
1af70 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
1af80 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
1af90 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
1afa0 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
1afb0 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
1afc0 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1afd0 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
1afe0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
1aff0 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
1b000 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1b010 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
1b020 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
1b030 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1b040 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
1b050 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
1b060 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
1b070 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
1b080 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
1b090 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
1b0a0 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
1b0b0 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
1b0c0 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
1b0d0 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
1b0e0 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
1b0f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
1b100 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
1b110 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
1b120 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1b130 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
1b140 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
1b150 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b160 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
1b170 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
1b180 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
1b190 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
1b1a0 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
1b1b0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1b1c0 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
1b1d0 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
1b1e0 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
1b1f0 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
1b200 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
1b210 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
1b220 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
1b230 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
1b240 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
1b250 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
1b260 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
1b270 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
1b280 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
1b290 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
1b2a0 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
1b2b0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
1b2c0 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
1b2d0 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
1b2e0 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
1b2f0 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
1b300 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
1b310 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
1b320 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
1b330 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
1b340 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
1b350 2a 2a 20 20 65 73 74 42 6f 75 6e 64 3a 0a 20 20  **  estBound:.  
1b360 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
1b370 61 74 65 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  ate on the amoun
1b380 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  t of the table t
1b390 68 61 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  hat must be sear
1b3a0 63 68 65 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20  ched.  A.    ** 
1b3b0 20 20 20 76 61 6c 75 65 20 6f 66 20 31 30 30 20     value of 100 
1b3c0 6d 65 61 6e 73 20 74 68 65 20 65 6e 74 69 72 65  means the entire
1b3d0 20 74 61 62 6c 65 20 69 73 20 73 65 61 72 63 68   table is search
1b3e0 65 64 2e 20 20 52 61 6e 67 65 20 63 6f 6e 73 74  ed.  Range const
1b3f0 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20  raints.    **   
1b400 20 6d 69 67 68 74 20 72 65 64 75 63 65 20 74 68   might reduce th
1b410 69 73 20 74 6f 20 61 20 76 61 6c 75 65 20 6c 65  is to a value le
1b420 73 73 20 74 68 61 6e 20 31 30 30 20 74 6f 20 69  ss than 100 to i
1b430 6e 64 69 63 61 74 65 20 74 68 61 74 20 6f 6e 6c  ndicate that onl
1b440 79 0a 20 20 20 20 2a 2a 20 20 20 20 61 20 66 72  y.    **    a fr
1b450 61 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  action of the ta
1b460 62 6c 65 20 6e 65 65 64 73 20 73 65 61 72 63 68  ble needs search
1b470 69 6e 67 2e 20 20 49 6e 20 74 68 65 20 61 62 73  ing.  In the abs
1b480 65 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ence of.    **  
1b490 20 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 41    sqlite_stat2 A
1b4a0 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 61 20 73  NALYZE data, a s
1b4b0 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c 69 74 79  ingle inequality
1b4c0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
1b4d0 72 63 68 0a 20 20 20 20 2a 2a 20 20 20 20 73 70  rch.    **    sp
1b4e0 61 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73  ace to 1/4rd its
1b4f0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20   original size. 
1b500 20 53 6f 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74   So an x>? const
1b510 72 61 69 6e 74 20 72 65 64 75 63 65 73 0a 20 20  raint reduces.  
1b520 20 20 2a 2a 20 20 20 20 65 73 74 42 6f 75 6e 64    **    estBound
1b530 20 74 6f 20 32 35 2e 20 20 54 77 6f 20 63 6f 6e   to 25.  Two con
1b540 73 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e  straints (x>? AN
1b550 44 20 78 3c 3f 29 20 72 65 64 75 63 65 20 65 73  D x<?) reduce es
1b560 74 42 6f 75 6e 64 20 74 6f 20 36 2e 0a 20 20 20  tBound to 6..   
1b570 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72   **.    **  bSor
1b580 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20  t:   .    **    
1b590 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
1b5a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
1b5b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68 61  ER BY clause tha
1b5c0 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
1b5d0 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78 74  n .    **    ext
1b5e0 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e  ernal sort (i.e.
1b5f0 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e   scanning the in
1b600 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75 61  dex being evalua
1b610 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20  ted will not .  
1b620 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74 6c    **    correctl
1b630 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73 29  y order records)
1b640 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b650 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a   bLookup: .    *
1b660 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
1b670 75 65 20 69 66 20 61 20 74 61 62 6c 65 20 6c 6f  ue if a table lo
1b680 6f 6b 75 70 20 69 73 20 72 65 71 75 69 72 65 64  okup is required
1b690 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
1b6a0 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 20 20 20  entry.    **    
1b6b0 76 69 73 69 74 65 64 2e 20 20 49 6e 20 6f 74 68  visited.  In oth
1b6c0 65 72 20 77 6f 72 64 73 2c 20 74 72 75 65 20 69  er words, true i
1b6d0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1b6e0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
1b6f0 20 20 20 20 2a 2a 20 20 20 20 54 68 69 73 20 69      **    This i
1b700 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66  s always false f
1b710 6f 72 20 74 68 65 20 72 6f 77 69 64 20 70 72 69  or the rowid pri
1b720 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 6f  mary key index o
1b730 66 20 61 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  f a table..    *
1b740 2a 20 20 20 20 46 6f 72 20 6f 74 68 65 72 20 69  *    For other i
1b750 6e 64 65 78 65 73 2c 20 69 74 20 69 73 20 74 72  ndexes, it is tr
1b760 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68  ue unless all th
1b770 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
1b780 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
1b790 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
1b7a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ECT statement ar
1b7b0 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
1b7c0 20 69 6e 64 65 78 20 28 73 75 63 68 20 61 6e 0a   index (such an.
1b7d0 20 20 20 20 2a 2a 20 20 20 20 69 6e 64 65 78 20      **    index 
1b7e0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 64 65 73  is sometimes des
1b7f0 63 72 69 62 65 64 20 61 73 20 61 20 63 6f 76 65  cribed as a cove
1b800 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a 20 20 20  ring index)..   
1b810 20 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70   **    For examp
1b820 6c 65 2c 20 67 69 76 65 6e 20 74 68 65 20 69 6e  le, given the in
1b830 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1b840 68 65 20 73 65 63 6f 6e 64 20 6f 66 20 74 68 65  he second of the
1b850 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1b860 2a 2a 20 20 20 20 74 77 6f 20 71 75 65 72 69 65  **    two querie
1b870 73 20 72 65 71 75 69 72 65 73 20 74 61 62 6c 65  s requires table
1b880 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20   b-tree lookups 
1b890 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6e 64  in order to find
1b8a0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a   the value.    *
1b8b0 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63  *    of column c
1b8c0 2c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  , but the first 
1b8d0 64 6f 65 73 20 6e 6f 74 20 62 65 63 61 75 73 65  does not because
1b8e0 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62   columns a and b
1b8f0 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 62   are.    **    b
1b900 6f 74 68 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  oth available in
1b910 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1b920 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1b930 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20        SELECT a, 
1b940 62 20 20 20 20 46 52 4f 4d 20 74 62 6c 20 57 48  b    FROM tbl WH
1b950 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a  ERE a = 1;.    *
1b960 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45  *             SE
1b970 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
1b980 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20  M tbl WHERE a = 
1b990 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  1;.    */.    in
1b9a0 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b9c0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1b9d0 4e 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67  N terms matching
1b9e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
1b9f0 74 20 62 49 6e 45 73 74 20 3d 20 30 3b 20 20 20  t bInEst = 0;   
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ba10 72 75 65 20 69 66 20 22 78 20 49 4e 20 28 53 45  rue if "x IN (SE
1ba20 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a  LECT...)" seen *
1ba30 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c  /.    int nInMul
1ba40 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1ba50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ba60 20 64 69 73 74 69 6e 63 74 20 65 71 75 61 6c 69   distinct equali
1ba70 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a  ties to lookup *
1ba80 2f 0a 20 20 20 20 69 6e 74 20 65 73 74 42 6f 75  /.    int estBou
1ba90 6e 64 20 3d 20 31 30 30 3b 20 20 20 20 20 20 20  nd = 100;       
1baa0 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
1bab0 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 73 65   reduction in se
1bac0 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 20 20  arch space */.  
1bad0 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30    int nBound = 0
1bae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1baf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e  /* Number of ran
1bb00 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1bb10 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  een */.    int b
1bb20 53 6f 72 74 20 3d 20 21 21 70 4f 72 64 65 72 42  Sort = !!pOrderB
1bb30 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  y;       /* True
1bb40 20 69 66 20 65 78 74 65 72 6e 61 6c 20 73 6f 72   if external sor
1bb50 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
1bb60 20 20 69 6e 74 20 62 44 69 73 74 20 3d 20 21 21    int bDist = !!
1bb70 70 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  pDistinct;      
1bb80 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 64 65 78  /* True if index
1bb90 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74   cannot help wit
1bba0 68 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  h DISTINCT */.  
1bbb0 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20    int bLookup = 
1bbc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1bbd0 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 61  /* True if not a
1bbe0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1bbf0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1bc00 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1bc10 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1bc20 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1bc30 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66  RE clause */.#if
1bc40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1bc50 45 5f 53 54 41 54 32 0a 20 20 20 20 57 68 65 72  E_STAT2.    Wher
1bc60 65 54 65 72 6d 20 2a 70 46 69 72 73 74 54 65 72  eTerm *pFirstTer
1bc70 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 46 69 72  m = 0;    /* Fir
1bc80 73 74 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67  st term matching
1bc90 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65   the index */.#e
1bca0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74  ndif..    /* Det
1bcb0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1bcc0 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e  s of nEq and nIn
1bcd0 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  Mul */.    for(n
1bce0 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65  Eq=0; nEq<pProbe
1bcf0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b  ->nColumn; nEq++
1bd00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
1bd10 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
1bd20 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54  n[nEq];.      pT
1bd30 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
1bd40 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1bd50 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73  Ready, eqTermMas
1bd60 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
1bd70 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
1bd80 72 65 61 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c  reak;.      wsFl
1bd90 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f  ags |= (WHERE_CO
1bda0 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f  LUMN_EQ|WHERE_RO
1bdb0 57 49 44 5f 45 51 29 3b 0a 20 20 20 20 20 20 69  WID_EQ);.      i
1bdc0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1bdd0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1bde0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1bdf0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
1be00 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  r;.        wsFla
1be10 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1be20 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
1be30 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1be40 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1be50 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1be60 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
1be70 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73  ELECT ...)":  As
1be80 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20  sume the SELECT 
1be90 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
1bea0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  */.          nIn
1beb0 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
1bec0 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
1bed0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1bee0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
1bef0 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
1bf00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1bf10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1bf20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
1bf30 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
1bf40 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1bf50 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  l *= pExpr->x.pL
1bf60 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1bf70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1bf80 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1bf90 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
1bfa0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  LL ){.        ws
1bfb0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1bfc0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
1bfd0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1bfe0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20  E_ENABLE_STAT2. 
1bff0 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
1c000 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70  && pProbe->aSamp
1c010 6c 65 20 29 20 70 46 69 72 73 74 54 65 72 6d 20  le ) pFirstTerm 
1c020 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a  = pTerm;.#endif.
1c030 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
1c040 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1c050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c060 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
1c070 6c 75 65 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e  lue of estBound.
1c080 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c   */.    if( nEq<
1c090 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
1c0a0 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72  && pProbe->bUnor
1c0b0 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dered==0 ){.    
1c0c0 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
1c0d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
1c0e0 0a 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54  .      if( findT
1c0f0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1c100 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
1c110 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
1c120 5f 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _GE, pIdx) ){.  
1c130 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1c140 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d  *pTop = findTerm
1c150 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
1c160 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
1c170 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20  O_LE, pIdx);.   
1c180 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1c190 70 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  pBtm = findTerm(
1c1a0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
1c1b0 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
1c1c0 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _GE, pIdx);.    
1c1d0 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
1c1e0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50  anEst(pParse, pP
1c1f0 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c  robe, nEq, pBtm,
1c200 20 70 54 6f 70 2c 20 26 65 73 74 42 6f 75 6e 64   pTop, &estBound
1c210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c220 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Top ){.         
1c230 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   nBound = 1;.   
1c240 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1c250 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
1c260 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73 65  T;.          use
1c270 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65  d |= pTop->prere
1c280 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
1c290 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
1c2a0 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tm ){.          
1c2b0 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20  nBound++;.      
1c2c0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1c2d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
1c2e0 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c            used |
1c2f0 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52 69  = pBtm->prereqRi
1c300 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ght;.        }. 
1c310 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1c320 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
1c330 52 41 4e 47 45 7c 57 48 45 52 45 5f 52 4f 57 49  RANGE|WHERE_ROWI
1c340 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 20 20  D_RANGE);.      
1c350 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1c360 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
1c370 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
1c380 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
1c390 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1c3a0 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  MN_IN );.      t
1c3b0 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1c3c0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1c3d0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66  NULL );.      if
1c3e0 28 20 28 77 73 46 6c 61 67 73 20 26 20 28 57 48  ( (wsFlags & (WH
1c3f0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1c400 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29  ERE_COLUMN_NULL)
1c410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c420 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1c430 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 7d  _UNIQUE;.      }
1c440 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c450 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1c460 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
1c470 64 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  d the index bein
1c480 67 20 63 6f 6e 73 69 64 65 72 65 64 20 77 69 6c  g considered wil
1c490 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c  l.    ** natural
1c4a0 6c 79 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20  ly scan rows in 
1c4b0 74 68 65 20 72 65 71 75 69 72 65 64 20 6f 72 64  the required ord
1c4c0 65 72 2c 20 73 65 74 20 74 68 65 20 61 70 70 72  er, set the appr
1c4d0 6f 70 72 69 61 74 65 20 66 6c 61 67 73 0a 20 20  opriate flags.  
1c4e0 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e    ** in wsFlags.
1c4f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1c500 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1c510 20 42 59 20 63 6c 61 75 73 65 20 62 75 74 20 74   BY clause but t
1c520 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  he index.    ** 
1c530 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69  will scan rows i
1c540 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  n a different or
1c550 64 65 72 2c 20 73 65 74 20 74 68 65 20 62 53 6f  der, set the bSo
1c560 72 74 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  rt variable.  */
1c570 0a 20 20 20 20 69 66 28 20 69 73 53 6f 72 74 69  .    if( isSorti
1c580 6e 67 49 6e 64 65 78 28 0a 20 20 20 20 20 20 20  ngIndex(.       
1c590 20 20 20 70 50 61 72 73 65 2c 20 70 57 43 2d 3e     pParse, pWC->
1c5a0 70 4d 61 73 6b 53 65 74 2c 20 70 50 72 6f 62 65  pMaskSet, pProbe
1c5b0 2c 20 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  , iCur, pOrderBy
1c5c0 2c 20 6e 45 71 2c 20 77 73 46 6c 61 67 73 2c 20  , nEq, wsFlags, 
1c5d0 26 72 65 76 29 0a 20 20 20 20 29 7b 0a 20 20 20  &rev).    ){.   
1c5e0 20 20 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20     bSort = 0;.  
1c5f0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1c600 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1c610 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  |WHERE_COLUMN_RA
1c620 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  NGE|WHERE_ORDERB
1c630 59 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  Y;.      wsFlags
1c640 20 7c 3d 20 28 72 65 76 20 3f 20 57 48 45 52 45   |= (rev ? WHERE
1c650 5f 52 45 56 45 52 53 45 20 3a 20 30 29 3b 0a 20  _REVERSE : 0);. 
1c660 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c670 74 68 65 72 65 20 69 73 20 61 20 44 49 53 54 49  there is a DISTI
1c680 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 61 6e  NCT qualifier an
1c690 64 20 74 68 69 73 20 69 6e 64 65 78 20 77 69 6c  d this index wil
1c6a0 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20  l scan rows in. 
1c6b0 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74     ** order of t
1c6c0 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70 72  he DISTINCT expr
1c6d0 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62  essions, clear b
1c6e0 44 69 73 74 20 61 6e 64 20 73 65 74 20 74 68 65  Dist and set the
1c6f0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 20   appropriate.   
1c700 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20 77 73 46   ** flags in wsF
1c710 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  lags. */.    if(
1c720 20 69 73 44 69 73 74 69 6e 63 74 49 6e 64 65 78   isDistinctIndex
1c730 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 50  (pParse, pWC, pP
1c740 72 6f 62 65 2c 20 69 43 75 72 2c 20 70 44 69 73  robe, iCur, pDis
1c750 74 69 6e 63 74 2c 20 6e 45 71 29 20 29 7b 0a 20  tinct, nEq) ){. 
1c760 20 20 20 20 20 62 44 69 73 74 20 3d 20 30 3b 0a       bDist = 0;.
1c770 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1c780 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
1c790 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
1c7a0 52 41 4e 47 45 7c 57 48 45 52 45 5f 44 49 53 54  RANGE|WHERE_DIST
1c7b0 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  INCT;.    }..   
1c7c0 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79   /* If currently
1c7d0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 74 68 65   calculating the
1c7e0 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 61   cost of using a
1c7f0 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20 74 68 65  n index (not the
1c800 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65   IPK.    ** inde
1c810 78 29 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  x), determine if
1c820 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20 63 6f   all required co
1c830 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79 20 62 65  lumn data may be
1c840 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75   obtained withou
1c850 74 20 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  t .    ** using 
1c860 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 28  the main table (
1c870 69 2e 65 2e 20 69 66 20 74 68 65 20 69 6e 64 65  i.e. if the inde
1c880 78 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 0a  x is a covering.
1c890 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72      ** index for
1c8a0 20 74 68 69 73 20 71 75 65 72 79 29 2e 20 49 66   this query). If
1c8b0 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1c8c0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66  WHERE_IDX_ONLY f
1c8d0 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73  lag in.    ** ws
1c8e0 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69 73 65  Flags. Otherwise
1c8f0 2c 20 73 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75  , set the bLooku
1c900 70 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 72  p variable to tr
1c910 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ue.  */.    if( 
1c920 70 49 64 78 20 26 26 20 77 73 46 6c 61 67 73 20  pIdx && wsFlags 
1c930 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
1c940 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
1c950 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
1c960 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
1c970 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
1c980 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1c990 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt x = pIdx->aiC
1c9a0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
1c9b0 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b    if( x<BMS-1 ){
1c9c0 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20  .          m &= 
1c9d0 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ~(((Bitmask)1)<<
1c9e0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
1c9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ca00 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
1ca10 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
1ca20 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
1ca30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ca40 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20  bLookup = 1;.   
1ca50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ca60 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74 69 6d 61  /*.    ** Estima
1ca70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1ca80 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 2e   rows of output.
1ca90 20 20 46 6f 72 20 61 6e 20 22 78 20 49 4e 20 28    For an "x IN (
1caa0 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20  SELECT...)".    
1cab0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64  ** constraint, d
1cac0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
1cad0 74 69 6d 61 74 65 20 65 78 63 65 65 64 20 68 61  timate exceed ha
1cae0 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  lf the rows in t
1caf0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
1cb00 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75  .    nRow = (dou
1cb10 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e 45  ble)(aiRowEst[nE
1cb20 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20  q] * nInMul);.  
1cb30 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20    if( bInEst && 
1cb40 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b  nRow*2>aiRowEst[
1cb50 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  0] ){.      nRow
1cb60 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32   = aiRowEst[0]/2
1cb70 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d  ;.      nInMul =
1cb80 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69   (int)(nRow / ai
1cb90 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20  RowEst[nEq]);.  
1cba0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1cbb0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
1cbc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
1cbd0 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74  nstraint is of t
1cbe0 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20  he form x=VALUE 
1cbf0 61 6e 64 20 68 69 73 74 6f 67 72 61 6d 0a 20 20  and histogram.  
1cc00 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61    ** data is ava
1cc10 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75 6d  ilable for colum
1cc20 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  n x, then it mig
1cc30 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ht be possible. 
1cc40 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20 62     ** to get a b
1cc50 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20 6f  etter estimate o
1cc60 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1cc70 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20 20  rows based on.  
1cc80 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20 68    ** VALUE and h
1cc90 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 76  ow common that v
1cca0 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69 6e  alue is accordin
1ccb0 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67 72  g to the histogr
1ccc0 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  am..    */.    i
1ccd0 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62 6c 65 29  f( nRow>(double)
1cce0 31 20 26 26 20 6e 45 71 3d 3d 31 20 26 26 20 70  1 && nEq==1 && p
1ccf0 46 69 72 73 74 54 65 72 6d 21 3d 30 20 29 7b 0a  FirstTerm!=0 ){.
1cd00 20 20 20 20 20 20 69 66 28 20 70 46 69 72 73 74        if( pFirst
1cd10 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
1cd20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  & (WO_EQ|WO_ISNU
1cd30 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74  LL) ){.        t
1cd40 65 73 74 63 61 73 65 28 20 70 46 69 72 73 74 54  estcase( pFirstT
1cd50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
1cd60 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
1cd70 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72 73   testcase( pFirs
1cd80 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  tTerm->eOperator
1cd90 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
1cda0 20 20 20 20 20 20 20 77 68 65 72 65 45 71 75 61         whereEqua
1cdb0 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
1cdc0 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54   pProbe, pFirstT
1cdd0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
1cde0 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20  ht, &nRow);.    
1cdf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46 69 72    }else if( pFir
1ce00 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1ce10 72 3d 3d 57 4f 5f 49 4e 20 26 26 20 62 49 6e 45  r==WO_IN && bInE
1ce20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1ce30 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
1ce40 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
1ce50 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78 70  pFirstTerm->pExp
1ce60 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 52 6f  r->x.pList, &nRo
1ce70 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
1ce80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ce90 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
1cea0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75 73  */..    /* Adjus
1ceb0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1cec0 6f 75 74 70 75 74 20 72 6f 77 73 20 61 6e 64 20  output rows and 
1ced0 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65 66 6c  downward to refl
1cee0 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20  ect rows.    ** 
1cef0 74 68 61 74 20 61 72 65 20 65 78 63 6c 75 64 65  that are exclude
1cf00 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e 73 74  d by range const
1cf10 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  raints..    */. 
1cf20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f 77 20     nRow = (nRow 
1cf30 2a 20 28 64 6f 75 62 6c 65 29 65 73 74 42 6f 75  * (double)estBou
1cf40 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31 30  nd) / (double)10
1cf50 30 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3c  0;.    if( nRow<
1cf60 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20  1 ) nRow = 1;.. 
1cf70 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74     /* Experiment
1cf80 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51  s run on real SQ
1cf90 4c 69 74 65 20 64 61 74 61 62 61 73 65 73 20 73  Lite databases s
1cfa0 68 6f 77 20 74 68 61 74 20 74 68 65 20 74 69 6d  how that the tim
1cfb0 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20  e needed.    ** 
1cfc0 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73  to do a binary s
1cfd0 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20  earch to locate 
1cfe0 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65  a row in a table
1cff0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75   or index is rou
1d000 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31  ghly.    ** log1
1d010 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74  0(N) times the t
1d020 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d  ime to move from
1d030 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20   one row to the 
1d040 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a  next row within.
1d050 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f      ** a table o
1d060 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63  r index.  The ac
1d070 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76  tual times can v
1d080 61 72 79 2c 20 77 69 74 68 20 74 68 65 20 73 69  ary, with the si
1d090 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63  ze of.    ** rec
1d0a0 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d  ords being an im
1d0b0 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20  portant factor. 
1d0c0 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20   Both moves and 
1d0d0 73 65 61 72 63 68 65 73 20 61 72 65 0a 20 20 20  searches are.   
1d0e0 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20   ** slower with 
1d0f0 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20  larger records, 
1d100 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75  presumably becau
1d110 73 65 20 66 65 77 65 72 20 72 65 63 6f 72 64 73  se fewer records
1d120 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f   fit.    ** on o
1d130 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63  ne page and henc
1d140 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76  e more pages hav
1d150 65 20 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e  e to be fetched.
1d160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d170 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1d180 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  nd and the sqlit
1d190 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69  e_stat1 and sqli
1d1a0 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 73 20  te_stat2 tables 
1d1b0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69  do.    ** not gi
1d1c0 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68  ve us data on th
1d1d0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
1d1e0 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   of table and in
1d1f0 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20  dex records..   
1d200 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70   ** So this comp
1d210 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  utation assumes 
1d220 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72  table records ar
1d230 65 20 61 62 6f 75 74 20 74 77 69 63 65 20 61 73  e about twice as
1d240 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69   big.    ** as i
1d250 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20  ndex records.   
1d260 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 73 46   */.    if( (wsF
1d270 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
1d280 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b  _FULLSCAN)==0 ){
1d290 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1d2a0 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  st of a full tab
1d2b0 6c 65 20 73 63 61 6e 20 69 73 20 61 20 6e 75 6d  le scan is a num
1d2c0 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72  ber of move oper
1d2d0 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20  ations equal.   
1d2e0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d     ** to the num
1d2f0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1d300 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
1d310 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 61  **.      ** We a
1d320 64 64 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  dd an additional
1d330 20 34 78 20 70 65 6e 61 6c 74 79 20 74 6f 20 66   4x penalty to f
1d340 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e  ull table scans.
1d350 20 20 54 68 69 73 20 63 61 75 73 65 73 0a 20 20    This causes.  
1d360 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20      ** the cost 
1d370 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72 72 20  function to err 
1d380 6f 6e 20 74 68 65 20 73 69 64 65 20 6f 66 20 63  on the side of c
1d390 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  hoosing an index
1d3a0 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 63   over.      ** c
1d3b0 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c 20 73  hoosing a full s
1d3c0 63 61 6e 2e 20 20 54 68 69 73 20 34 78 20 66 75  can.  This 4x fu
1d3d0 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74 79 20  ll-scan penalty 
1d3e0 69 73 20 61 6e 20 61 72 67 75 61 62 6c 65 0a 20  is an arguable. 
1d3f0 20 20 20 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e       ** decision
1d400 20 61 6e 64 20 6f 6e 65 20 77 68 69 63 68 20 77   and one which w
1d410 65 20 65 78 70 65 63 74 20 74 6f 20 72 65 76 69  e expect to revi
1d420 73 69 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  sit in the futur
1d430 65 2e 20 20 42 75 74 0a 20 20 20 20 20 20 2a 2a  e.  But.      **
1d440 20 69 74 20 73 65 65 6d 73 20 74 6f 20 62 65 20   it seems to be 
1d450 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f  working well eno
1d460 75 67 68 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e  ugh at the momen
1d470 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1d480 20 20 63 6f 73 74 20 3d 20 61 69 52 6f 77 45 73    cost = aiRowEs
1d490 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 7d 65 6c 73  t[0]*4;.    }els
1d4a0 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20  e{.      log10N 
1d4b0 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73  = estLog(aiRowEs
1d4c0 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f 73  t[0]);.      cos
1d4d0 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20  t = nRow;.      
1d4e0 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
1d4f0 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20      if( bLookup 
1d500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d510 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f  For an index loo
1d520 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  kup followed by 
1d530 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a  a table lookup:.
1d540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
1d550 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61  nInMul index sea
1d560 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68  rches to find th
1d570 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1d580 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20  index range.    
1d590 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1d5a0 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1d5b0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
1d5c0 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61     **  + nRow ta
1d5d0 62 6c 65 20 73 65 61 72 63 68 65 73 20 74 6f 20  ble searches to 
1d5e0 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65  lookup the table
1d5f0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
1d600 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20   rowid.         
1d610 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f   */.          co
1d620 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20  st += (nInMul + 
1d630 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20  nRow)*log10N;.  
1d640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20         /* For a 
1d660 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 3a 0a  covering index:.
1d670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20            **    
1d680 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65   nInMul index se
1d690 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74  arches to find t
1d6a0 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79  he initial entry
1d6b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20   .          **  
1d6c0 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68   + nRow steps th
1d6d0 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a  rough the index.
1d6e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1d6f0 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e         cost += n
1d700 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20  InMul*log10N;.  
1d710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1d720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1d730 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d  For a rowid prim
1d740 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a  ary key lookup:.
1d750 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1d760 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72  nMult table sear
1d770 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1d780 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66   initial entry f
1d790 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20  or each range.  
1d7a0 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77        **  + nRow
1d7b0 20 73 74 65 70 73 20 74 68 72 6f 75 67 68 20 74   steps through t
1d7c0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
1d7d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 73 74   */.        cost
1d7e0 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30   += nInMul*log10
1d7f0 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  N;.      }.    }
1d800 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20  ..    /* Add in 
1d810 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f  the estimated co
1d820 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68  st of sorting th
1d830 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61  e result.  Actua
1d840 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20  l experimental. 
1d850 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e     ** measuremen
1d860 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65  ts of sorting pe
1d870 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c  rformance in SQL
1d880 69 74 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f  ite show that so
1d890 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a  rting time.    *
1d8a0 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30  * adds C*N*log10
1d8b0 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c  (N) to the cost,
1d8c0 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
1d8d0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
1d8e0 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72  o be .    ** sor
1d8f0 74 65 64 20 61 6e 64 20 43 20 69 73 20 61 20 66  ted and C is a f
1d900 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e  actor between 1.
1d910 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20  95 and 4.3.  We 
1d920 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20  will split the. 
1d930 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65     ** difference
1d940 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66   and select C of
1d950 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   3.0..    */.   
1d960 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20   if( bSort ){.  
1d970 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77      cost += nRow
1d980 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b  *estLog(nRow)*3;
1d990 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1d9a0 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  Dist ){.      co
1d9b0 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  st += nRow*estLo
1d9c0 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d  g(nRow)*3;.    }
1d9d0 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74  ..    /**** Cost
1d9e0 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73 20 69   of using this i
1d9f0 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65  ndex has now bee
1da00 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f  n computed ****/
1da10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1da20 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c  e are additional
1da30 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
1da40 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
1da50 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  cannot.    ** be
1da60 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 63   used with the c
1da70 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75  urrent index, bu
1da80 74 20 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f  t which might lo
1da90 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  wer the number. 
1daa0 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20     ** of output 
1dab0 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65  rows, adjust the
1dac0 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f   nRow value acco
1dad0 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f  rdingly.  This o
1dae0 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74  nly .    ** matt
1daf0 65 72 73 20 69 66 20 74 68 65 20 63 75 72 72 65  ers if the curre
1db00 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  nt index is the 
1db10 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f  least costly, so
1db20 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20   do not bother. 
1db30 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20     ** with this 
1db40 73 74 65 70 20 69 66 20 77 65 20 61 6c 72 65 61  step if we alrea
1db50 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64  dy know this ind
1db60 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  ex will not be c
1db70 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c  hosen..    ** Al
1db80 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65  so, never reduce
1db90 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1dba0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73  count below 2 us
1dbb0 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20  ing this step.. 
1dbc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20     **.    ** It 
1dbd0 69 73 20 63 72 69 74 69 63 61 6c 20 74 68 61 74  is critical that
1dbe0 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   the notValid ma
1dbf0 73 6b 20 62 65 20 75 73 65 64 20 68 65 72 65 20  sk be used here 
1dc00 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1dc10 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d  * the notReady m
1dc20 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75  ask.  When compu
1dc30 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c  ting an "optimal
1dc40 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74  " index, the not
1dc50 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73  Ready.    ** mas
1dc60 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65  k will only have
1dc70 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74   one bit set - t
1dc80 68 65 20 62 69 74 20 66 6f 72 20 74 68 65 20 63  he bit for the c
1dc90 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
1dca0 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69    ** The notVali
1dcb0 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f  d mask, on the o
1dcc0 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79  ther hand, alway
1dcd0 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73  s has all bits s
1dce0 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61  et for.    ** ta
1dcf0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  bles that are no
1dd00 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73  t in outer loops
1dd10 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69  .  If notReady i
1dd20 73 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  s used here inst
1dd30 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f  ead.    ** of no
1dd40 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f  tValid, then a o
1dd50 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61  ptimal index tha
1dd60 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e  t depends on inn
1dd70 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20  er joins loops. 
1dd80 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73     ** might be s
1dd90 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77 68 65  elected even whe
1dda0 6e 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  n there exists a
1ddb0 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20  n optimal index 
1ddc0 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  that has.    ** 
1ddd0 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e  no such dependen
1dde0 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  cy..    */.    i
1ddf0 66 28 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73  f( nRow>2 && cos
1de00 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  t<=pCost->rCost 
1de10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1de40 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  unter */.      i
1de50 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71  nt nSkipEq = nEq
1de60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1de70 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73  umber of == cons
1de80 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20  traints to skip 
1de90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b  */.      int nSk
1dea0 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64  ipRange = nBound
1deb0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1dec0 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73  of < constraints
1ded0 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20   to skip */.    
1dee0 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61    Bitmask thisTa
1def0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1df00 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72  * Bitmap for pSr
1df10 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73  c */..      this
1df20 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57  Tab = getMask(pW
1df30 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
1df40 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  r);.      for(pT
1df50 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
1df60 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32  C->nTerm; nRow>2
1df70 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72   && k; k--, pTer
1df80 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
1df90 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1dfa0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1dfb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1dfc0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1dfd0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56  prereqAll & notV
1dfe0 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62 20 29  alid)!=thisTab )
1dff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e000 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
1e010 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1e020 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1e030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
1e040 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20  f( nSkipEq ){.  
1e050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
1e060 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6e 45  ore the first nE
1e070 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68  q equality match
1e080 65 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  es since the ind
1e090 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1e0a0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1e0b0 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1e0c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1e0d0 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20   nSkipEq--;.    
1e0e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
1e100 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  me each addition
1e110 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63  al equality matc
1e120 68 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65  h reduces the re
1e130 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20  sult.           
1e140 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20   ** set size by 
1e150 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a  a factor of 10 *
1e160 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  /.            nR
1e170 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20  ow /= 10;.      
1e180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e190 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65  lse if( pTerm->e
1e1a0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
1e1b0 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
1e1c0 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _GE) ){.        
1e1d0 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65    if( nSkipRange
1e1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e1f0 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69  /* Ignore the fi
1e200 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72  rst nSkipRange r
1e210 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1e220 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1e230 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e240 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1e250 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1e260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1e270 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20  SkipRange--;.   
1e280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
1e2a0 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69 6f  ume each additio
1e2b0 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  nal range constr
1e2c0 61 69 6e 74 20 72 65 64 75 63 65 73 20 74 68 65  aint reduces the
1e2d0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
1e2e0 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20      ** set size 
1e2f0 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33  by a factor of 3
1e300 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65  .  Indexed range
1e310 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64   constraints red
1e320 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  uce.            
1e330 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ** the search sp
1e340 61 63 65 20 62 79 20 61 20 6c 61 72 67 65 72 20  ace by a larger 
1e350 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d  factor: 4.  We m
1e360 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67  ake indexed rang
1e370 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1e380 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20   more selective 
1e390 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65  intentionally be
1e3a0 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  cause of the sub
1e3b0 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20 20 20  jective .       
1e3c0 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74       ** observat
1e3d0 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64  ion that indexed
1e3e0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1e3f0 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f  ts really are mo
1e400 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
1e410 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70  * selective in p
1e420 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72  ractice, on aver
1e430 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
1e440 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20      nRow /= 3;. 
1e450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e460 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
1e470 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
1e480 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  O_NOOP ){.      
1e490 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72      /* Any other
1e4a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65   expression lowe
1e4b0 72 73 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  rs the output ro
1e4c0 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20  w count by half 
1e4d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f  */.          nRo
1e4e0 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  w /= 2;.        
1e4f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e500 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f  if( nRow<2 ) nRo
1e510 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20  w = 2;.    }... 
1e520 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a     WHERETRACE((.
1e530 20 20 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e        "%s(%s): n
1e540 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20  Eq=%d nInMul=%d 
1e550 65 73 74 42 6f 75 6e 64 3d 25 64 20 62 53 6f 72  estBound=%d bSor
1e560 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20  t=%d bLookup=%d 
1e570 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a  wsFlags=0x%x\n".
1e580 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20        "         
1e590 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20  notReady=0x%llx 
1e5a0 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77  log10N=%.1f nRow
1e5b0 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 20  =%.1f cost=%.1f 
1e5c0 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a  used=0x%llx\n",.
1e5d0 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62        pSrc->pTab
1e5e0 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f  ->zName, (pIdx ?
1e5f0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
1e600 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45  ipk"), .      nE
1e610 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73 74 42 6f  q, nInMul, estBo
1e620 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f 6f  und, bSort, bLoo
1e630 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a 20 20  kup, wsFlags,.  
1e640 20 20 20 20 6e 6f 74 52 65 61 64 79 2c 20 6c 6f      notReady, lo
1e650 67 31 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f 73 74  g10N, nRow, cost
1e660 2c 20 75 73 65 64 0a 20 20 20 20 29 29 3b 0a 0a  , used.    ));..
1e670 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1e680 6e 64 65 78 20 69 73 20 74 68 65 20 62 65 73 74  ndex is the best
1e690 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f   we have seen so
1e6a0 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63 6f 72   far, then recor
1e6b0 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e  d this.    ** in
1e6c0 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f 73 74  dex and its cost
1e6d0 20 69 6e 20 74 68 65 20 70 43 6f 73 74 20 73 74   in the pCost st
1e6e0 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1e6f0 20 20 20 20 69 66 28 20 28 21 70 49 64 78 20 7c      if( (!pIdx |
1e700 7c 20 77 73 46 6c 61 67 73 29 0a 20 20 20 20 20  | wsFlags).     
1e710 26 26 20 28 63 6f 73 74 3c 70 43 6f 73 74 2d 3e  && (cost<pCost->
1e720 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74 3c 3d  rCost || (cost<=
1e730 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26 26 20  pCost->rCost && 
1e740 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e  nRow<pCost->plan
1e750 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29 7b 0a 20  .nRow)).    ){. 
1e760 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73       pCost->rCos
1e770 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
1e780 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73  pCost->used = us
1e790 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  ed;.      pCost-
1e7a0 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f  >plan.nRow = nRo
1e7b0 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
1e7c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 28  plan.wsFlags = (
1e7d0 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67 4d 61  wsFlags&wsFlagMa
1e7e0 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  sk);.      pCost
1e7f0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e 45 71  ->plan.nEq = nEq
1e800 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
1e810 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64  lan.u.pIdx = pId
1e820 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  x;.    }..    /*
1e830 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
1e840 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1e850 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  se, then only th
1e860 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a  at one index is.
1e870 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
1e880 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  d. */.    if( pS
1e890 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72 65  rc->pIndex ) bre
1e8a0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 65  ak;..    /* Rese
1e8b0 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  t masks for the 
1e8c0 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20 74 68  next index in th
1e8d0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 77 73  e loop */.    ws
1e8e0 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57 48 45  FlagMask = ~(WHE
1e8f0 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
1e900 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a  E_ROWID_RANGE);.
1e910 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
1e920 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 0a   idxEqTermMask;.
1e930 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1e940 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
1e950 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
1e960 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1e970 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a 20 69  rder flag.  ** i
1e980 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 76 65  s set, then reve
1e990 72 73 65 20 74 68 65 20 6f 72 64 65 72 20 74 68  rse the order th
1e9a0 61 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  at the index wil
1e9b0 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20 20 2a  l be scanned.  *
1e9c0 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20 75 73  * in. This is us
1e9d0 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61 74 69  ed for applicati
1e9e0 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f 20 68  on testing, to h
1e9f0 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73 0a 20  elp find cases. 
1ea00 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c 69 63   ** where applic
1ea10 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75 72 20  ation behaviour 
1ea20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 28  depends on the (
1ea30 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64 65 72  undefined) order
1ea40 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c 69 74   that.  ** SQLit
1ea50 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69  e outputs rows i
1ea60 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e 63 65  n in the absence
1ea70 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42 59 20   of an ORDER BY 
1ea80 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
1ea90 28 20 21 70 4f 72 64 65 72 42 79 20 26 26 20 70  ( !pOrderBy && p
1eaa0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1eab0 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   & SQLITE_Revers
1eac0 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 70 43  eOrder ){.    pC
1ead0 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1eae0 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
1eaf0 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  SE;.  }..  asser
1eb00 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 28  t( pOrderBy || (
1eb10 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1eb20 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
1eb30 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1eb40 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  t( pCost->plan.u
1eb50 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70 43 6f  .pIdx==0 || (pCo
1eb60 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1eb70 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 29  &WHERE_ROWID_EQ)
1eb80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1eb90 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30   pSrc->pIndex==0
1eba0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 73   .       || pCos
1ebb0 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  t->plan.u.pIdx==
1ebc0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 6f  0 .       || pCo
1ebd0 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  st->plan.u.pIdx=
1ebe0 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 0a 20  =pSrc->pIndex . 
1ebf0 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43   );..  WHERETRAC
1ec00 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69  E(("best index i
1ec10 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 28  s: %s\n", .    (
1ec20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46  (pCost->plan.wsF
1ec30 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
1ec40 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 3f 20  _FULLSCAN)==0 ? 
1ec50 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20 20 20 20  "none" : .      
1ec60 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75     pCost->plan.u
1ec70 2e 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70  .pIdx ? pCost->p
1ec80 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
1ec90 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b  e : "ipk").  ));
1eca0 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75  .  .  bestOrClau
1ecb0 73 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  seIndex(pParse, 
1ecc0 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1ecd0 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70  ady, notValid, p
1ece0 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b  OrderBy, pCost);
1ecf0 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74 69 63  .  bestAutomatic
1ed00 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57  Index(pParse, pW
1ed10 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64  C, pSrc, notRead
1ed20 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f  y, pCost);.  pCo
1ed30 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1ed40 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a   |= eqTermMask;.
1ed50 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
1ed60 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
1ed70 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65   accessing table
1ed80 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69   pSrc->pTab. Wri
1ed90 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
1eda0 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
1edb0 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
1edc0 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
1edd0 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73   supplied .** as
1ede0 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65   the last parame
1edf0 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
1ee00 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65  on may calculate
1ee10 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20   the cost of.** 
1ee20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69  both real and vi
1ee30 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e  rtual table scan
1ee40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1ee50 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  d bestIndex(.  P
1ee60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ee70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ee80 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1ee90 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
1eea0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
1eeb0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1eec0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1eed0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1eee0 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
1eef0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1ef00 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
1ef10 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
1ef20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1ef30 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 6e 6f  sk of cursors no
1ef40 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
1ef50 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
1ef60 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
1ef70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1ef80 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
1ef90 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  le for any purpo
1efa0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
1efb0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
1efc0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
1efd0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1efe0 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74  WhereCost *pCost
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f000 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79  owest cost query
1f010 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e   plan */.){.#ifn
1f020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f030 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
1f040 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72  f( IsVirtual(pSr
1f050 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  c->pTab) ){.    
1f060 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1f070 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62  fo *p = 0;.    b
1f080 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
1f090 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
1f0a0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
1f0b0 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42 79 2c  Valid, pOrderBy,
1f0c0 20 70 43 6f 73 74 2c 26 70 29 3b 0a 20 20 20 20   pCost,&p);.    
1f0d0 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65  if( p->needToFre
1f0e0 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
1f0f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1f100 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a  >idxStr);.    }.
1f110 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f120 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  e(pParse->db, p)
1f130 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1f140 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42 74 72  .  {.    bestBtr
1f150 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  eeIndex(pParse, 
1f160 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1f170 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 70  ady, notValid, p
1f180 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 43 6f 73  OrderBy, 0, pCos
1f190 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1f1a0 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
1f1b0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1f1c0 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
1f1d0 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
1f1e0 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
1f1f0 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
1f200 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
1f210 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
1f220 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
1f230 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
1f240 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
1f250 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
1f260 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
1f270 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f280 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
1f290 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
1f2a0 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1f2b0 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1f2c0 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
1f2d0 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
1f2e0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
1f2f0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
1f300 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
1f310 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
1f320 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
1f330 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
1f340 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
1f350 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
1f360 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
1f370 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
1f380 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
1f390 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
1f3a0 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
1f3b0 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
1f3c0 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
1f3d0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
1f3e0 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
1f3f0 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
1f400 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
1f410 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
1f420 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
1f430 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38 36 35  OF: R-24597-5865
1f440 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65 20 64  5 No tests are d
1f450 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20 74 68  one for terms th
1f460 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65  at are.** comple
1f470 74 65 6c 79 20 73 61 74 69 73 66 69 65 64 20 62  tely satisfied b
1f480 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  y indices..**.**
1f490 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
1f4a0 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
1f4b0 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
1f4c0 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
1f4d0 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
1f4e0 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
1f4f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1f500 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
1f510 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1f520 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
1f530 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
1f540 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
1f550 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
1f560 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
1f570 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
1f580 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
1f590 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
1f5a0 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
1f5b0 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
1f5c0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1f5d0 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
1f5e0 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
1f5f0 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
1f600 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
1f610 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
1f620 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
1f630 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
1f640 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
1f650 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
1f660 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
1f670 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
1f680 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
1f690 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
1f6a0 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
1f6b0 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
1f6c0 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
1f6d0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
1f6e0 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
1f6f0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
1f700 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
1f710 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
1f720 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
1f730 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
1f740 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
1f750 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
1f760 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
1f770 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
1f780 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
1f790 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
1f7a0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
1f7b0 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
1f7c0 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
1f7d0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
1f7e0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
1f7f0 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
1f800 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f810 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69   Code an OP_Affi
1f820 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61  nity opcode to a
1f830 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pply the column 
1f840 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1f850 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  zAff.** to the n
1f860 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1f870 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a  ing at base. .**
1f880 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69  .** As an optimi
1f890 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41  zation, SQLITE_A
1f8a0 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
1f8b0 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70  (which are no-op
1f8c0 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67  s) at the.** beg
1f8d0 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f  inning and end o
1f8e0 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72  f zAff are ignor
1f8f0 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72  ed.  If all entr
1f900 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a  ies in zAff are.
1f910 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
1f920 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65  NE, then no code
1f930 20 67 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e   gets generated.
1f940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f950 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77  ine makes its ow
1f960 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73  n copy of zAff s
1f970 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
1f980 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20  r is free.** to 
1f990 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66 74 65  modify zAff afte
1f9a0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
1f9b0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
1f9c0 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79  c void codeApply
1f9d0 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a  Affinity(Parse *
1f9e0 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65  pParse, int base
1f9f0 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a  , int n, char *z
1fa00 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Aff){.  Vdbe *v 
1fa10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1fa20 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
1fa30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1fa40 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1fa50 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
1fa60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
1fa70 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f  rt( v!=0 );..  /
1fa80 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e  * Adjust base an
1fa90 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  d n to skip over
1faa0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
1fab0 20 65 6e 74 72 69 65 73 20 61 74 20 74 68 65 20   entries at the 
1fac0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61  beginning.  ** a
1fad0 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66  nd end of the af
1fae0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20  finity string.. 
1faf0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30   */.  while( n>0
1fb00 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c   && zAff[0]==SQL
1fb10 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
1fb20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73      n--;.    bas
1fb30 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b  e++;.    zAff++;
1fb40 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e  .  }.  while( n>
1fb50 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d  1 && zAff[n-1]==
1fb60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1fb70 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a  ){.    n--;.  }.
1fb80 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f  .  /* Code the O
1fb90 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64  P_Affinity opcod
1fba0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1fbb0 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64  ything left to d
1fbc0 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20  o. */.  if( n>0 
1fbd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1fbe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1fbf0 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e  ffinity, base, n
1fc00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1fc10 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
1fc20 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20  , zAff, n);.    
1fc30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1fc40 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1fc50 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
1fc60 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
1fc70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1fc80 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
1fc90 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
1fca0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
1fcb0 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
1fcc0 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
1fcd0 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
1fce0 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
1fcf0 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
1fd00 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
1fd10 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
1fd20 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
1fd30 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
1fd40 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
1fd50 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
1fd60 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
1fd70 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
1fd80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
1fd90 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
1fda0 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
1fdb0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1fdc0 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
1fdd0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
1fde0 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
1fdf0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
1fe00 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
1fe10 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
1fe20 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
1fe30 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
1fe40 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
1fe50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1fe60 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1fe70 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1fe80 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1fe90 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
1fea0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1feb0 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
1fec0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1fed0 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e  *pLevel, /* When
1fee0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
1fef0 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
1ff00 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
1ff10 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
1ff20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
1ff30 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
1ff40 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1ff50 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
1ff60 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
1ff70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
1ff80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ff90 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
1ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ffb0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
1ffc0 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
1ffd0 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
1ffe0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
1fff0 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65  TK_EQ ){.    iRe
20000 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
20010 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
20020 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pX->pRight, iT
20030 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20  arget);.  }else 
20040 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pX->op==TK_I
20050 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65  SNULL ){.    iRe
20060 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20  g = iTarget;.   
20070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20080 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
20090 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66  , iReg);.#ifndef
200a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
200b0 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
200c0 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
200d0 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
200e0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
200f0 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  In;..    assert(
20100 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
20110 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  ;.    iReg = iTa
20120 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20  rget;.    eType 
20130 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
20140 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c  ndex(pParse, pX,
20150 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20   0);.    iTab = 
20160 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
20170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20180 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
20190 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73  iTab, 0);.    as
201a0 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  sert( pLevel->pl
201b0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
201c0 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20  RE_IN_ABLE );.  
201d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e    if( pLevel->u.
201e0 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  in.nIn==0 ){.   
201f0 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e     pLevel->addrN
20200 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
20210 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20220 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
20230 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  u.in.nIn++;.    
20240 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
20250 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71  Loop =.       sq
20260 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
20270 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
20280 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
20290 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
202c0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
202d0 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69  [0])*pLevel->u.i
202e0 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  n.nIn);.    pIn 
202f0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  = pLevel->u.in.a
20300 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  InLoop;.    if( 
20310 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  pIn ){.      pIn
20320 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   += pLevel->u.in
20330 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20  .nIn - 1;.      
20340 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62  pIn->iCur = iTab
20350 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
20360 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
20370 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  D ){.        pIn
20380 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
20390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
203a0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
203b0 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20  b, iReg);.      
203c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
203d0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
203e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
203f0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
20400 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a  iTab, 0, iReg);.
20410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
20420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
20430 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52  v, OP_IsNull, iR
20440 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eg);.    }else{.
20450 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e        pLevel->u.
20460 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  in.nIn = 0;.    
20470 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
20480 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
20490 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
204a0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
204b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
204c0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
204d0 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
204e0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
204f0 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a  r an.** index..*
20500 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
20510 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
20520 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
20530 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
20540 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
20550 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
20560 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
20570 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
20580 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
20590 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
205a0 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
205b0 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
205c0 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
205d0 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
205e0 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
205f0 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
20600 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
20610 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
20620 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
20630 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20640 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
20650 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
20660 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
20670 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
20680 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
20690 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
206a0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
206b0 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
206c0 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
206d0 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
206e0 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
206f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
20700 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
20710 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
20720 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
20730 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
20740 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
20750 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
20760 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
20770 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
20780 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
20790 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
207a0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
207b0 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
207c0 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
207d0 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
207e0 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
207f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
20800 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
20810 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
20820 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 74 75  ry cell and retu
20830 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rns.** the index
20840 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
20850 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65 20 74  cell. The code t
20860 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
20870 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
20880 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  se that memory c
20890 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ell to store the
208a0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20   termination.** 
208b0 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  key value of the
208c0 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f   loop.  If one o
208d0 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74  r more IN operat
208e0 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e  ors appear, then
208f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
20900 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64   allocates an ad
20910 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d  ditional nEq mem
20920 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e  ory cells for in
20930 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a  ternal.** use..*
20940 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
20950 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20 69 73  rning, *pzAff is
20960 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
20970 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
20980 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  ning a.** copy o
20990 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  f the column aff
209a0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f 66 20  inity string of 
209b0 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f 63 61  the index alloca
209c0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
209d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20  ite3DbMalloc(). 
209e0 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65 73 20  Except, entries 
209f0 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  in the copy of t
20a00 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  he string associ
20a10 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65 71 75  ated.** with equ
20a20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
20a30 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e 45 20  s that use NONE 
20a40 61 66 66 69 6e 69 74 79 20 61 72 65 20 73 65 74  affinity are set
20a50 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46   to.** SQLITE_AF
20a60 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69 73 20  F_NONE. This is 
20a70 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 51 4c  to deal with SQL
20a80 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f 6c   such as the fol
20a90 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
20aa0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
20ab0 61 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b  a TEXT PRIMARY K
20ac0 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53 45 4c  EY, b);.**   SEL
20ad0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
20ae0 41 53 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  AS t2, t1 WHERE 
20af0 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a  t1.a = t2.b;.**.
20b00 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  ** In the exampl
20b10 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69 6e 64  e above, the ind
20b20 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61 73 20  ex on t1(a) has 
20b30 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 42  TEXT affinity. B
20b40 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68 65 20  ut since.** the 
20b50 72 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  right hand side 
20b60 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  of the equality 
20b70 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32 2e 62  constraint (t2.b
20b80 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66 69 6e  ) has NONE affin
20b90 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65  ity,.** no conve
20ba0 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  rsion should be 
20bb0 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f 72 65  attempted before
20bc0 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20 76 61   using a t2.b va
20bd0 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  lue as part of.*
20be0 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61 72 63  * a key to searc
20bf0 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48 65 6e  h the index. Hen
20c00 63 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ce the first byt
20c10 65 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  e in the returne
20c20 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  d affinity.** st
20c30 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65 78 61  ring in this exa
20c40 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20 73 65  mple would be se
20c50 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46 46 5f  t to SQLITE_AFF_
20c60 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NONE..*/.static 
20c70 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
20c80 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
20c90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20ca0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20cb0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
20cc0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
20cd0 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
20ce0 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
20cf0 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
20d00 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
20d10 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
20d20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
20d30 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
20d40 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
20d50 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
20d60 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
20d70 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
20d80 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
20d90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20da0 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
20db0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
20dc0 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
20dd0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
20de0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
20df0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
20e00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  /.){.  int nEq =
20e10 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45   pLevel->plan.nE
20e20 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  q;   /* The numb
20e30 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
20e40 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
20e50 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
20e60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
20e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 6d 20        /* The vm 
20e80 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
20e90 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
20ea0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
20eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
20ec0 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
20ed0 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
20ee0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76   int iCur = pLev
20ef0 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f  el->iTabCur;   /
20f00 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
20f10 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
20f20 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f40 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
20f50 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  int term */.  in
20f60 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
20f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20f80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20f90 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20fb0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
20fc0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ff0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
21000 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
21010 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  *zAff;          
21020 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
21030 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20 72  nity string to r
21040 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  eturn */..  /* T
21050 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f 6e  his module is on
21060 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75 65  ly called on que
21070 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75 73  ry plans that us
21080 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  e an index. */. 
21090 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
210a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
210b0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 3b  WHERE_INDEXED );
210c0 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  .  pIdx = pLevel
210d0 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a  ->plan.u.pIdx;..
210e0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
210f0 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
21100 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
21110 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
21120 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
21130 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
21140 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
21150 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
21160 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  nEq + nExtraReg;
21170 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
21180 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66  += nReg;..  zAff
21190 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
211a0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  up(pParse->db, s
211b0 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
211c0 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29  ityStr(v, pIdx))
211d0 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b  ;.  if( !zAff ){
211e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
211f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
21200 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
21210 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
21220 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
21230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
21240 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71  dx->nColumn>=nEq
21250 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   );.  for(j=0; j
21260 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
21270 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20  int r1;.    int 
21280 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
21290 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d  mn[j];.    pTerm
212a0 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
212b0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
212c0 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  dy, pLevel->plan
212d0 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78 29 3b  .wsFlags, pIdx);
212e0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
212f0 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65 61 6b  Term==0) ) break
21300 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
21310 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f 72 20  lowing true for 
21320 69 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64  indices with red
21330 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20  undant columns. 
21340 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41  .    ** Ex: CREA
21350 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
21360 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54  1(a,b,a); SELECT
21370 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
21380 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f   a=0 AND b=0; */
21390 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
213a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
213b0 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20   TERM_CODED)!=0 
213c0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
213d0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
213e0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
213f0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
21400 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 72 31  -11662 */.    r1
21410 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
21420 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
21430 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61  m, pLevel, regBa
21440 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
21450 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
21460 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
21470 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
21480 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21490 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
214a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
214b0 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
214c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
214d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
214e0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
214f0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
21500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21510 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21520 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21530 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
21540 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
21550 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
21560 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
21570 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
21580 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
21590 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
215a0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
215b0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
215c0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
215d0 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
215e0 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
215f0 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
21600 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
21610 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
21620 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
21630 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
21640 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
21650 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
21660 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
21670 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
21680 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
21690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
216a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
216b0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
216c0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
216d0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
216e0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
216f0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
21700 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21710 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
21720 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
21730 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
21740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21750 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
21760 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
21770 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
21780 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
21790 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
217a0 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
217b0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
217c0 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
217d0 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
217e0 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
217f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
21800 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
21810 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
21820 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
21830 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
21840 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
21850 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
21860 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
21870 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
21880 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
21890 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
218a0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
218b0 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
218c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
218d0 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
218e0 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
218f0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21910 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
21920 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
21930 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
21940 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
21950 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21960 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
21970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
21980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21990 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
219a0 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
219b0 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
219c0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
219d0 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
219e0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
219f0 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
21a00 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73  Column, -1);.  s
21a10 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21a20 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20  pend(pStr, zOp, 
21a30 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
21a40 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
21a50 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "?", 1);.}../*
21a60 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65  .** Argument pLe
21a70 76 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20  vel describes a 
21a80 73 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61  strategy for sca
21a90 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62  nning table pTab
21aa0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
21ab0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
21ac0 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
21ad0 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  g buffer contain
21ae0 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69 6f  ing a descriptio
21af0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 73  n.** of the subs
21b00 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f 77 73  et of table rows
21b10 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 65 20   scanned by the 
21b20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68 65 20  strategy in the 
21b30 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20 53 51  form of an.** SQ
21b40 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 4f 72  L expression. Or
21b50 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  , if all rows ar
21b60 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20  e scanned, NULL 
21b70 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
21b80 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
21b90 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
21ba0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
21bb0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
21bc0 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
21bd0 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
21be0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
21bf0 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
21c00 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
21c10 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
21c20 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
21c30 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
21c40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
21c50 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ned pointer poin
21c60 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74  ts to memory obt
21c70 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
21c80 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  e3DbMalloc()..**
21c90 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
21ca0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
21cb0 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
21cc0 74 68 65 20 62 75 66 66 65 72 20 77 68 65 6e 20  the buffer when 
21cd0 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  it is.** no long
21ce0 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
21cf0 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
21d00 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 73  lainIndexRange(s
21d10 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
21d20 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
21d30 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
21d40 57 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c 61 6e  WherePlan *pPlan
21d50 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = &pLevel->plan
21d60 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
21d70 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70 49 64  x = pPlan->u.pId
21d80 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70  x;.  int nEq = p
21d90 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74  Plan->nEq;.  int
21da0 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   i, j;.  Column 
21db0 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  *aCol = pTab->aC
21dc0 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ol;.  int *aiCol
21dd0 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
21de0 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63 63  Column;.  StrAcc
21df0 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20 6e  um txt;..  if( n
21e00 45 71 3d 3d 30 20 26 26 20 28 70 50 6c 61 6e 2d  Eq==0 && (pPlan-
21e10 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
21e20 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
21e30 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30  E_TOP_LIMIT))==0
21e40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21e50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
21e60 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78 74  trAccumInit(&txt
21e70 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 4d  , 0, 0, SQLITE_M
21e80 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74 78  AX_LENGTH);.  tx
21e90 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c  t.db = db;.  sql
21ea0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
21eb0 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20 32  nd(&txt, " (", 2
21ec0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
21ed0 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 65  nEq; i++){.    e
21ee0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
21ef0 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61  (&txt, i, aCol[a
21f00 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
21f10 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20  e, "=");.  }..  
21f20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 50 6c  j = i;.  if( pPl
21f30 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  an->wsFlags&WHER
21f40 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
21f50 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64     explainAppend
21f60 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20  Term(&txt, i++, 
21f70 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
21f80 5d 2e 7a 4e 61 6d 65 2c 20 22 3e 22 29 3b 0a 20  ].zName, ">");. 
21f90 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e   }.  if( pPlan->
21fa0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f  wsFlags&WHERE_TO
21fb0 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65  P_LIMIT ){.    e
21fc0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
21fd0 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b 61  (&txt, i, aCol[a
21fe0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
21ff0 65 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73  e, "<");.  }.  s
22000 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
22010 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c 20  pend(&txt, ")", 
22020 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1);.  return sql
22030 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
22040 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sh(&txt);.}../*.
22050 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22060 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
22070 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  ss currently pro
22080 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50 4c 41  cessing an EXPLA
22090 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 2a 2a  IN QUERY PLAN.**
220a0 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
220b0 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 6d   query being com
220c0 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58 50 4c  piled is an EXPL
220d0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2c 20  AIN QUERY PLAN, 
220e0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f  a single.** reco
220f0 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
22100 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
22110 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
22120 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
22130 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a   .** pLevel..*/.
22140 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
22150 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61  ainOneScan(.  Pa
22160 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22180 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
22190 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
221a0 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  bList,          
221b0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73      /* Table lis
221c0 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65  t this loop refe
221d0 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65  rs to */.  Where
221e0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
221f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
22200 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45  an to write OP_E
22210 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f  xplain opcode fo
22220 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  r */.  int iLeve
22230 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
22240 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
22250 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75  for "level" colu
22260 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a  mn of output */.
22270 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
222a0 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  from" column of 
222b0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20  output */.  u16 
222c0 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
222d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
222e0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 73  lags passed to s
222f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
22300 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  () */.){.  if( p
22310 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
22320 32 20 29 7b 0a 20 20 20 20 75 33 32 20 66 6c 61  2 ){.    u32 fla
22330 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  gs = pLevel->pla
22340 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 73  n.wsFlags;.    s
22350 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22360 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
22370 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
22380 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64 62  >iFrom];.    Vdb
22390 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
223a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56 4d  Vdbe;      /* VM
223b0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
223c0 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
223d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
223e0 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  db;     /* Datab
223f0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
22400 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
22430 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
22440 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22450 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 nRow;         
22460 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
22470 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
22480 69 74 65 64 20 62 79 20 73 63 61 6e 20 2a 2f 0a  ited by scan */.
22490 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 50      int iId = pP
224a0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
224b0 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20 28    /* Select id (
224c0 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75 74  left-most output
224d0 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20 20   column) */.    
224e0 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20 20  int isSearch;   
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22500 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41 52   True for a SEAR
22510 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 43  CH. False for SC
22520 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  AN. */..    if( 
22530 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d 55 4c  (flags&WHERE_MUL
22540 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74 72 6c  TI_OR) || (wctrl
22550 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e 45 54  Flags&WHERE_ONET
22560 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72 65 74  ABLE_ONLY) ) ret
22570 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65 61 72  urn;..    isSear
22580 63 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ch = (pLevel->pl
22590 61 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20 20 20  an.nEq>0).      
225a0 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73         || (flags
225b0 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  &(WHERE_BTM_LIMI
225c0 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
225d0 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  T))!=0.         
225e0 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61      || (wctrlFla
225f0 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42  gs&(WHERE_ORDERB
22600 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45  Y_MIN|WHERE_ORDE
22610 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20  RBY_MAX));..    
22620 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
22630 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
22640 69 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48  isSearch?"SEARCH
22650 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69  ":"SCAN");.    i
22660 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
22670 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  t ){.      zMsg 
22680 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22690 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
226a0 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d  SUBQUERY %d", zM
226b0 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  sg,pItem->iSelec
226c0 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tId);.    }else{
226d0 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
226e0 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
226f0 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c  , zMsg, "%s TABL
22700 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  E %s", zMsg, pIt
22710 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
22720 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  }..    if( pItem
22730 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
22740 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22750 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
22760 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a  g, "%s AS %s", z
22770 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
22780 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  as);.    }.    i
22790 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  f( (flags & WHER
227a0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
227b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68  .      char *zWh
227c0 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64  ere = explainInd
227d0 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 65 76  exRange(db, pLev
227e0 65 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  el, pItem->pTab)
227f0 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
22800 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22810 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
22820 4e 47 20 25 73 25 73 49 4e 44 45 58 25 73 25 73  NG %s%sINDEX%s%s
22830 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20 20 20  %s", zMsg, .    
22840 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20        ((flags & 
22850 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
22860 29 3f 22 41 55 54 4f 4d 41 54 49 43 20 22 3a 22  )?"AUTOMATIC ":"
22870 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
22880 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
22890 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52 49 4e  X_ONLY)?"COVERIN
228a0 47 20 22 3a 22 22 29 2c 0a 20 20 20 20 20 20 20  G ":""),.       
228b0 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
228c0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22  RE_TEMP_INDEX)?"
228d0 22 3a 22 20 22 29 2c 0a 20 20 20 20 20 20 20 20  ":" "),.        
228e0 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
228f0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22  E_TEMP_INDEX)?""
22900 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  : pLevel->plan.u
22910 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  .pIdx->zName),. 
22920 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 0a           zWhere.
22930 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
22940 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22950 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65   zWhere);.    }e
22960 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
22970 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
22980 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
22990 45 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67  E) ){.      zMsg
229a0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
229b0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
229c0 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
229d0 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
229e0 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66  g);..      if( f
229f0 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44  lags&WHERE_ROWID
22a00 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _EQ ){.        z
22a10 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
22a20 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
22a30 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22 2c 20  "%s (rowid=?)", 
22a40 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
22a50 73 65 20 69 66 28 20 28 66 6c 61 67 73 26 57 48  se if( (flags&WH
22a60 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 29 3d  ERE_BOTH_LIMIT)=
22a70 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  =WHERE_BOTH_LIMI
22a80 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
22a90 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22aa0 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22ab0 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44 20 72  s (rowid>? AND r
22ac0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
22ad0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22ae0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54 4d   flags&WHERE_BTM
22af0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
22b00 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22b10 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
22b20 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f 29  g, "%s (rowid>?)
22b30 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
22b40 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
22b50 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
22b60 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22b70 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22b80 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22b90 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67  (rowid<?)", zMsg
22ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22bc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
22bd0 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28  E.    else if( (
22be0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  flags & WHERE_VI
22bf0 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29  RTUALTABLE)!=0 )
22c00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22c10 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61  index_info *pVta
22c20 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  bIdx = pLevel->p
22c30 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a  lan.u.pVtabIdx;.
22c40 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22c50 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
22c60 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55   zMsg, "%s VIRTU
22c70 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
22c80 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22ca0 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
22cb0 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
22cc0 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  r);.    }.#endif
22cd0 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c  .    if( wctrlFl
22ce0 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52  ags&(WHERE_ORDER
22cf0 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44  BY_MIN|WHERE_ORD
22d00 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20 20 20  ERBY_MAX) ){.   
22d10 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
22d20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
22d30 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b 0a 20  ORDERBY_MIN );. 
22d40 20 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b 0a 20       nRow = 1;. 
22d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d60 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74 65 33 5f  nRow = (sqlite3_
22d70 69 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e 70 6c  int64)pLevel->pl
22d80 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 20  an.nRow;.    }. 
22d90 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22da0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
22db0 73 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64 20 72  sg, "%s (~%lld r
22dc0 6f 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f  ows)", zMsg, nRo
22dd0 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  w);.    sqlite3V
22de0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
22df0 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c  Explain, iId, iL
22e00 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73  evel, iFrom, zMs
22e10 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
22e20 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
22e30 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e 65 53  fine explainOneS
22e40 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  can(u,v,w,x,y,z)
22e50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22e60 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
22e70 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  /.../*.** Genera
22e80 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
22e90 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
22ea0 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
22eb0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
22ec0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
22ed0 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
22ee0 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
22ef0 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
22f00 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
22f10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
22f20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
22f30 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
22f40 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22f50 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
22f60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
22f70 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
22f80 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
22f90 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31  be coded */.  u1
22fa0 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
22fb0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
22fc0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
22fd0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
22fe0 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61  Int.h */.  Bitma
22ff0 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
23000 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
23010 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
23020 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
23030 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
23040 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23050 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
23060 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
23070 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
23080 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
23090 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
230a0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
230b0 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
230c0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
230d0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
230e0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
230f0 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
23100 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
23110 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
23120 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
23130 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
23140 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
23150 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
23160 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
23170 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
23180 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
23190 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
231a0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
231b0 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
231c0 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
231d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
231e0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
231f0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
23200 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
23210 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
23220 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23240 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23250 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
23280 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
23290 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
232a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
232b0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
232c0 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
232d0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
232e0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
232f0 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
23300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
23310 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
23320 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
23330 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
23340 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23350 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
23360 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
23370 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
23380 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
23390 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
233a0 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
233b0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
233c0 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
233d0 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
233e0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
233f0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
23400 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
23410 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
23420 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
23430 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
23440 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
23450 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a   = pWInfo->pWC;.
23460 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
23470 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
23480 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
23490 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
234a0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
234b0 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
234c0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62  em->iCursor;.  b
234d0 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  Rev = (pLevel->p
234e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
234f0 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
23500 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
23510 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
23520 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
23530 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
23540 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
23550 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
23560 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20  CE_TABLE)==0;.. 
23570 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
23580 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
23590 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
235a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
235b0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
235c0 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
235d0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
235e0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
235f0 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
23600 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
23610 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
23620 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
23630 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
23640 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
23650 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
23660 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
23670 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
23680 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
23690 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
236a0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
236b0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
236c0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
236d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
236e0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
236f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
23700 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
23710 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
23720 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
23730 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
23740 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
23750 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
23760 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
23770 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23780 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
23790 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
237a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
237b0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
237c0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
237d0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
237e0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
237f0 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
23800 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
23810 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
23820 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
23830 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
23840 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
23850 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
23860 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
23870 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
23880 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
23890 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
238a0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
238b0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
238c0 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
238d0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
238e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
238f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
23900 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
23910 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
23920 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
23930 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
23940 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66  lag"));.  }..#if
23950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23960 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
23970 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  if(  (pLevel->pl
23980 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
23990 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
239a0 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
239b0 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65  se 0:  The table
239c0 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
239d0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
239e0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
239f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
23a00 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
23a10 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
23a20 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
23a30 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
23a40 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  ilter */.    sql
23a50 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
23a60 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
23a70 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
23a80 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
23a90 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
23aa0 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
23ab0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
23ac0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
23ad0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
23ae0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
23b20 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
23b30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
23b40 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
23b50 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
23b60 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b90 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
23ba0 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
23bb0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ;..    sqlite3Ex
23bc0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
23bd0 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  se);.    iReg = 
23be0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
23bf0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e  nge(pParse, nCon
23c00 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
23c10 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e  for(j=1; j<=nCon
23c20 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
23c30 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
23c40 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b  nConstraint; k++
23c50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
23c60 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64  Usage[k].argvInd
23c70 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  ex==j ){.       
23c80 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
23c90 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54  Constraint[k].iT
23ca0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
23cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23cc0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 57 43  Code(pParse, pWC
23cd0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
23ce0 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a  ->pRight, iReg+j
23cf0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  +1);.          b
23d00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
23d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23d20 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( k==nConstraint
23d30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
23d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
23d60 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69  ger, pVtabIdx->i
23d70 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20  dxNum, iReg);.  
23d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23d90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
23da0 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b  r, j-1, iReg+1);
23db0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23dc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
23dd0 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
23de0 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62  Brk, iReg, pVtab
23df0 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20  Idx->idxStr,.   
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
23e20 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20  dToFreeIdxStr ? 
23e30 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f  P4_MPRINTF : P4_
23e40 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74  STATIC);.    pVt
23e50 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  abIdx->needToFre
23e60 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  eIdxStr = 0;.   
23e70 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
23e80 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
23e90 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
23ea0 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20  j].omit ){.     
23eb0 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
23ec0 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54  Constraint[j].iT
23ed0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
23ee0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
23ef0 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69  Level, &pWC->a[i
23f00 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Term]);.      }.
23f10 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
23f20 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
23f30 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
23f40 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
23f50 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
23f60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
23f70 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
23f80 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
23f90 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
23fa0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
23fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23fc0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
23fd0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
23fe0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23ff0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
24000 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  .  if( pLevel->p
24010 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
24020 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
24030 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
24040 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
24050 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
24060 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
24070 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
24080 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
24090 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
240a0 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
240b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
240c0 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
240d0 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
240e0 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
240f0 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  ..)".    **     
24100 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
24110 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65 6c 65      */.    iRele
24120 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
24130 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24140 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e);.    pTerm = 
24150 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
24160 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
24170 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
24180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24190 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61  Term!=0 );.    a
241a0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
241b0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  xpr!=0 );.    as
241c0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66  sert( pTerm->lef
241d0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
241e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
241f0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
24200 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
24210 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
24220 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45  _VIRTUAL ); /* E
24230 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  V: R-30575-11662
24240 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64 52 65   */.    iRowidRe
24250 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
24260 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
24270 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c  rm, pLevel, iRel
24280 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64  easeReg);.    ad
24290 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
242a0 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c  addrNxt;.    sql
242b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
242c0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
242d0 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e  iRowidReg, addrN
242e0 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
242f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
24300 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72  _NotExists, iCur
24310 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69  , addrNxt, iRowi
24320 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dReg);.    sqlit
24330 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
24340 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
24350 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
24360 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
24370 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70  v, "pk"));.    p
24380 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
24390 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  oop;.  }else if(
243a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
243b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
243c0 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
243d0 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
243e0 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
243f0 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
24400 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
24410 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
24420 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
24430 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
24440 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
24450 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
24460 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
24470 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
24480 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
24490 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  able==0 );.    p
244a0 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
244b0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
244c0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
244d0 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70  WO_GE, 0);.    p
244e0 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  End = findTerm(p
244f0 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
24500 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
24510 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _LE, 0);.    if(
24520 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
24530 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
24540 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
24550 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
24560 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
24570 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
24580 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
24590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
245a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
245b0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
245c0 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
245d0 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
245e0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
245f0 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
24600 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
24610 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
24620 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
24630 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
24640 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
24650 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
24660 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
24670 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
24680 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
24690 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
246a0 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
246b0 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
246c0 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
246d0 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
246e0 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20    OP_SeekGt,.   
246f0 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
24700 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a   */  OP_SeekLe,.
24710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
24720 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
24730 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
24740 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
24750 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGe.      };.  
24760 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
24770 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
24780 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
24790 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
247a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
247b0 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
247c0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
247d0 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
247e0 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
247f0 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
24800 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
24810 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
24820 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  t. */..      tes
24830 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77  tcase( pStart->w
24840 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
24850 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
24860 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
24870 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61  .      pX = pSta
24880 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
24890 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
248a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
248b0 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73  pStart->leftCurs
248c0 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
248d0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
248e0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
248f0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
24900 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
24910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
24920 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
24930 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
24940 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
24950 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
24960 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
24970 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24980 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
24990 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
249a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
249b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
249c0 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
249d0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
249e0 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
249f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24a10 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
24a20 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
24a30 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
24a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24a50 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
24a60 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
24a70 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
24a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
24a90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
24aa0 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43  ert( pEnd->leftC
24ab0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
24ac0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24ad0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
24ae0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
24af0 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31  * EV: R-30575-11
24b00 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d  662 */.      mem
24b10 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61  EndValue = ++pPa
24b20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
24b30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b40 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
24b50 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65  ght, memEndValue
24b60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  );.      if( pX-
24b70 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
24b80 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
24b90 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
24ba0 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
24bb0 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  P_Ge;.      }els
24bc0 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  e{.        testO
24bd0 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74  p = bRev ? OP_Lt
24be0 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20   : OP_Gt;.      
24bf0 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  }.      disableT
24c00 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
24c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
24c20 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
24c30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
24c40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
24c50 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
24c60 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  : OP_Next;.    p
24c70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
24c80 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  ;.    pLevel->p2
24c90 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 69 66   = start;.    if
24ca0 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26 20 70  ( pStart==0 && p
24cb0 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  End==0 ){.      
24cc0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
24cd0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
24ce0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
24cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24d00 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
24d10 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  5==0 );.    }.  
24d20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
24d30 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 69  _Noop ){.      i
24d40 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c 65  RowidReg = iRele
24d50 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33  aseReg = sqlite3
24d60 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24d70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
24d80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24d90 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69  P_Rowid, iCur, i
24da0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
24db0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
24dc0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
24dd0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
24de0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
24df0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
24e00 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61  testOp, memEndVa
24e10 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  lue, addrBrk, iR
24e20 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
24e30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
24e40 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46  eP5(v, SQLITE_AF
24e50 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49  F_NUMERIC | SQLI
24e60 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
24e70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
24e80 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24e90 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
24ea0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
24eb0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b  RE_COLUMN_EQ) ){
24ec0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20  .    /* Case 3: 
24ed0 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20  A scan using an 
24ee0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
24ef0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
24f00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
24f10 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
24f20 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
24f30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
24f40 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22  terms ("==" or "
24f50 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74  IN" operators) t
24f60 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
24f70 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   N.    **       
24f80 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
24f90 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
24fa0 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
24fb0 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ntain.    **    
24fc0 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79 20       inequality 
24fd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c 20  constraints (>, 
24fe0 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20  <, >= or <=) on 
24ff0 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20 20  the indexed.    
25000 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
25010 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74 65  n that immediate
25020 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e  ly follows the N
25030 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c   equalities. Onl
25040 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
25050 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    the right-most
25060 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61   column can be a
25070 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74  n inequality - t
25080 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20  he rest must.   
25090 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
250a0 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
250b0 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72  " operators. For
250c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
250d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
250e0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
250f0 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
25100 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
25110 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a   are all .    **
25120 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
25130 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed:.    **.    *
25140 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
25150 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25160 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a     x=5 AND y=10.
25170 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
25180 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20    x=5 AND y<10. 
25190 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
251a0 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41 4e 44   x=5 AND y>5 AND
251b0 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20   y<10.    **    
251c0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
251d0 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20  y=5 AND z<=10.  
251e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
251f0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
25200 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
25210 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
25220 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20  d, only.    **  
25230 20 20 20 20 20 20 20 74 68 65 20 78 3d 35 20 74         the x=5 t
25240 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  erm:.    **.    
25250 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
25260 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a  5 AND z<10.    *
25270 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
25280 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 69   N may be zero i
25290 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
252a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
252b0 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ts..    **      
252c0 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20     If there are 
252d0 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  no inequality co
252e0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20  nstraints, then 
252f0 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a 20 20  N is at.    **  
25300 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
25310 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25320 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
25330 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
25340 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
25350 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
25360 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
25370 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
25380 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
25390 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
253a0 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  er.    **       
253b0 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f    to force the o
253c0 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63  utput order to c
253d0 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44  onform to an ORD
253e0 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a  ER BY..    */  .
253f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
25400 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d   u8 aStartOp[] =
25410 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20   {.      0,.    
25420 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65    0,.      OP_Re
25430 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
25440 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
25450 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
25460 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
25470 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74  */.      OP_Last
25480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
25490 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73   3: (!start_cons
254a0 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74  traints && start
254b0 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f  Eq &&   bRev) */
254c0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74  .      OP_SeekGt
254d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  ,           /* 4
254e0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
254f0 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
25500 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
25510 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20       OP_SeekLt, 
25520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20            /* 5: 
25530 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
25540 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20  ts  && !startEq 
25550 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
25560 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20     OP_SeekGe,   
25570 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73          /* 6: (s
25580 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
25590 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
255a0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
255b0 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20   OP_SeekLe      
255c0 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
255d0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
255e0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
255f0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
25600 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
25610 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b   u8 aEndOp[] = {
25620 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
25630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
25640 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
25650 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
25660 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
25670 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
25680 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
25690 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
256a0 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
256b0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
256c0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
256d0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
256e0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
256f0 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20  ->plan.nEq;  /* 
25700 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
25710 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  IN terms */.    
25720 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
25730 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
25740 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
25750 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
25760 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69  in(x).. */.    i
25770 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
25780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
25790 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
257a0 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
257b0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e  values */.    in
257c0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
257d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
257e0 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  mp register */. 
257f0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
25800 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
25810 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
25820 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
25830 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
25840 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
25850 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
25860 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
25870 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
25880 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
25890 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
258a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
258b0 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
258c0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
258d0 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
25900 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
25910 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
25920 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
25930 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
25940 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
25950 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
25960 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
25970 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
25980 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25990 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
259a0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
259b0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
259c0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
259d0 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
259e0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ng */.    int iI
259f0 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  dxCur;          
25a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
25a10 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
25a20 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
25a30 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
25a40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
25a50 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
25a60 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64 20  egisters needed 
25a70 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  */.    int op;  
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
25aa0 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
25ab0 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66 66   char *zStartAff
25ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25ad0 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73 74   Affinity for st
25ae0 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e  art of range con
25af0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 63  straint */.    c
25b00 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20 20  har *zEndAff;   
25b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25b20 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64 20  ffinity for end 
25b30 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
25b40 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64 78  int */..    pIdx
25b50 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
25b60 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78  u.pIdx;.    iIdx
25b70 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  Cur = pLevel->iI
25b80 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20 70  dxCur;.    k = p
25b90 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
25ba0 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  q];     /* Colum
25bb0 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74 79  n for inequality
25bc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
25bd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
25be0 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61  loop satisfies a
25bf0 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72   sort order (pOr
25c00 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74  derBy) request t
25c10 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20  hat .    ** was 
25c20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
25c30 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
25c40 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
25c50 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
25c60 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74  ** query, then t
25c70 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
25c80 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f  nly allow the lo
25c90 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20  op to run for.  
25ca0 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74    ** a single it
25cb0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  eration. This me
25cc0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72  ans that the fir
25cd0 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a  st row returned.
25ce0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f      ** should no
25cf0 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61  t have a NULL va
25d00 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78  lue stored in 'x
25d10 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27  '. If column 'x'
25d20 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66   is.    ** the f
25d30 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74  irst one after t
25d40 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20  he nEq equality 
25d50 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
25d60 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
25d70 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
25d80 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
25d90 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ling..    */.   
25da0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
25db0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
25dc0 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  IN)!=0.     && (
25dd0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
25de0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
25df0 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49 64  BY).     && (pId
25e00 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a  x->nColumn>nEq).
25e10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
25e20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
25e30 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a 2f  ->nExpr==1 ); */
25e40 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
25e50 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ( pOrderBy->a[0]
25e60 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
25e70 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
25e80 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20 20  nEq] ); */.     
25e90 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b   isMinQuery = 1;
25ea0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
25eb0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
25ec0 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e 65   /* Find any ine
25ed0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
25ee0 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65  nt terms for the
25ef0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 0a   start and end .
25f00 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 61      ** of the ra
25f10 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nge. .    */.   
25f20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
25f30 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
25f40 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
25f50 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d       pRangeEnd =
25f60 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
25f70 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
25f80 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c  , (WO_LT|WO_LE),
25f90 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45   pIdx);.      nE
25fa0 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
25fb0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
25fc0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
25fd0 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
25fe0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
25ff0 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  eStart = findTer
26000 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
26010 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54  notReady, (WO_GT
26020 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a  |WO_GE), pIdx);.
26030 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20        nExtraReg 
26040 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
26050 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
26060 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
26070 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
26080 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
26090 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
260a0 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
260b0 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
260c0 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
260d0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
260e0 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
260f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42  .    */.    regB
26100 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75  ase = codeAllEqu
26110 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20 20  alityTerms(.    
26120 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65 76      pParse, pLev
26130 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61 64  el, pWC, notRead
26140 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26 7a  y, nExtraReg, &z
26150 53 74 61 72 74 41 66 66 0a 20 20 20 20 29 3b 0a  StartAff.    );.
26160 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73 71      zEndAff = sq
26170 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
26180 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74  arse->db, zStart
26190 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Aff);.    addrNx
261a0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
261b0 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Nxt;..    /* If 
261c0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72  we are doing a r
261d0 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61  everse order sca
261e0 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  n on an ascendin
261f0 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20  g index, or.    
26200 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64  ** a forward ord
26210 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73  er scan on a des
26220 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69  cending index, i
26230 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a  nterchange the .
26240 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64      ** start and
26250 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e   end terms (pRan
26260 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e  geStart and pRan
26270 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  geEnd)..    */. 
26280 20 20 20 69 66 28 20 6e 45 71 3c 70 49 64 78 2d     if( nEq<pIdx-
26290 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65 76  >nColumn && bRev
262a0 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  ==(pIdx->aSortOr
262b0 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45  der[nEq]==SQLITE
262c0 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20  _SO_ASC) ){.    
262d0 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
262e0 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
262f0 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
26300 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
26310 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
26320 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
26330 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
26340 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26350 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
26360 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
26370 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
26380 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26390 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
263a0 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
263b0 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
263c0 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
263d0 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
263e0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
263f0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61 72  O_GE );.    star
26400 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61  tEq = !pRangeSta
26410 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72  rt || pRangeStar
26420 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  t->eOperator & (
26430 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
26440 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61    endEq =   !pRa
26450 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65  ngeEnd || pRange
26460 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
26470 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
26480 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
26490 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
264a0 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
264b0 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69     /* Seek the i
264c0 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74  ndex cursor to t
264d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
264e0 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43  range. */.    nC
264f0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
26500 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53  .    if( pRangeS
26510 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78  tart ){.      Ex
26520 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
26530 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d  ngeStart->pExpr-
26540 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
26550 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
26560 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72  Parse, pRight, r
26570 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20  egBase+nEq);.   
26580 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74     if( (pRangeSt
26590 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  art->wtFlags & T
265a0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b  ERM_VNULL)==0 ){
265b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
265c0 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75  ExprCodeIsNullJu
265d0 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65  mp(v, pRight, re
265e0 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e  gBase+nEq, addrN
265f0 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
26600 20 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66     if( zStartAff
26610 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26620 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
26630 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
26640 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d  StartAff[nEq])==
26650 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
26660 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
26670 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ince the compari
26680 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72  son is to be per
26690 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63  formed with no c
266a0 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20  onversions.     
266b0 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20       ** applied 
266c0 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
266d0 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
266e0 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
266f0 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
26700 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46     ** SQLITE_AFF
26710 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20  _NONE.  */.     
26720 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
26730 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
26740 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
26750 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
26760 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
26770 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52  ffinityChange(pR
26780 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
26790 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  nEq]) ){.       
267a0 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71     zStartAff[nEq
267b0 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ] = SQLITE_AFF_N
267c0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
267d0 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e       }  .      n
267e0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
267f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
26800 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
26810 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
26820 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
26830 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
26840 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
26850 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
26860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26870 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
26880 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
26890 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
268a0 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
268b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
268c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
268d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
268e0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
268f0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
26900 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74  nConstraint, zSt
26910 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
26920 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
26930 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
26940 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
26950 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
26960 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
26970 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26980 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
26990 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
269a0 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
269b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
269c0 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
269d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
269e0 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
269f0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
26a00 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
26a10 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
26a20 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
26a30 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
26a40 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
26a50 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
26a60 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
26a70 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
26a80 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
26a90 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
26aa0 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
26ab0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
26ac0 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
26ad0 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
26ae0 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
26af0 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
26b00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
26b10 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
26b20 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
26b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26b40 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
26b50 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
26b60 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
26b70 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
26b80 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
26b90 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
26ba0 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
26bb0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
26bc0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
26bd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26be0 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
26bf0 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
26c00 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
26c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26c20 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
26c30 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26c40 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
26c50 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
26c60 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
26c70 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
26c80 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
26c90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
26ca0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
26cb0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
26cc0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
26cd0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
26ce0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
26cf0 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
26d00 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
26d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
26d20 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
26d30 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
26d40 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
26d50 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
26d60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26d70 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
26d80 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
26d90 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
26da0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
26db0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
26dc0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
26dd0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
26de0 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
26df0 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
26e00 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
26e10 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
26e20 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
26e30 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
26e40 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
26e50 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
26e60 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
26e70 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
26e80 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  62 */.    }.    
26e90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
26ea0 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61 72 74  arse->db, zStart
26eb0 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
26ec0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
26ed0 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20  db, zEndAff);.. 
26ee0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
26ef0 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20   loop body */.  
26f00 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
26f10 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26f20 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f  tAddr(v);..    /
26f30 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
26f40 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70  ndex cursor is p
26f50 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
26f60 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20  he range. */.   
26f70 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52   op = aEndOp[(pR
26f80 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20  angeEnd || nEq) 
26f90 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20  * (1 + bRev)];. 
26fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26fb0 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20  =OP_Noop );.    
26fc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26fd0 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65  _IdxGE );.    te
26fe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49  stcase( op==OP_I
26ff0 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20  dxLT );.    if( 
27000 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20  op!=OP_Noop ){. 
27010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27020 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
27030 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
27040 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
27050 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
27060 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
27070 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
27080 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a  ev ?1:0);.    }.
27090 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
270a0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
270b0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
270c0 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
270d0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
270e0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61  table column tha
270f0 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  t the inequality
27100 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f   contrains is no
27110 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49  t NULL..    ** I
27120 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
27130 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
27140 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
27150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d  .    */.    r1 =
27160 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27170 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
27180 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
27190 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
271a0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
271b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
271c0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
271d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
271e0 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  OP_LIMIT );.    
271f0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
27200 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
27210 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
27220 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d  RE_TOP_LIMIT))!=
27230 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27240 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27250 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
27260 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
27270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27280 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
27290 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
272a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
272b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
272c0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
272d0 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
272e0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
272f0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
27300 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
27310 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
27320 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
27330 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
27340 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
27350 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
27360 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
27370 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
27380 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
27390 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
273a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
273b0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
273c0 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
273d0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
273e0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
273f0 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
27400 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
27410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
27430 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
27440 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
27450 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
27460 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
27470 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
27480 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
27490 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
274a0 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
274b0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
274c0 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
274d0 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
274e0 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
274f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
27500 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27510 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20  RE_UNIQUE ){.   
27520 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
27530 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
27540 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
27550 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
27560 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
27570 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
27580 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
27590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
275a0 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
275b0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
275c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
275d0 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
275e0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
275f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
27600 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
27610 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 77    /* Case 4:  Tw
27620 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
27630 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
27640 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
27650 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
27660 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
27670 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
27680 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
27690 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
276a0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
276b0 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
276c0 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
276d0 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
276e0 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
276f0 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
27700 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
27710 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
27720 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
27730 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
27740 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
27750 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
27760 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
27770 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
27780 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
27790 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
277a0 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
277b0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
277c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
277d0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
277f0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
27800 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
27810 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
27820 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
27830 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
27840 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
27850 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
27860 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
27870 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
27880 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
27890 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
278a0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
278b0 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
278c0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
278d0 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
278e0 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
278f0 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
27900 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
27910 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
27920 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
27930 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27940 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
27950 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
27960 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
27970 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
27980 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
27990 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
279a0 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
279b0 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
279c0 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
279d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
279e0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
279f0 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
27a00 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
27a10 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
27a20 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
27a30 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
27a40 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
27a50 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
27a60 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
27a70 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
27a80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27a90 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
27aa0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
27ab0 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
27ac0 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
27ad0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
27ae0 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
27af0 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
27b00 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
27b10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27b20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
27b30 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
27b40 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
27b50 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
27b60 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27b70 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
27ba0 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
27bb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
27bc0 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
27bd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
27be0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
27bf0 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
27c00 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
27c10 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
27c20 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
27c30 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
27c40 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
27c50 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
27c60 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
27c70 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65  n */..    int re
27c80 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
27c90 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20  se->nMem;       
27ca0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
27cb0 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73  used with OP_Gos
27cc0 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ub */.    int re
27cd0 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20  gRowset = 0;    
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
27d00 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  for RowSet objec
27d10 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  t */.    int reg
27d20 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d40 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
27d50 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  olding rowid */.
27d60 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64      int iLoopBod
27d70 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  y = sqlite3VdbeM
27d80 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
27d90 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62   Start of loop b
27da0 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ody */.    int i
27db0 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20  RetInit;        
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
27de0 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69  of regReturn ini
27df0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74  t */.    int unt
27e00 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20  estedTerms = 0; 
27e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27e20 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f  ome terms not co
27e30 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20  mpletely tested 
27e40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
27e50 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
27e60 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54  Level->plan.u.pT
27e70 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  erm;.    assert(
27e80 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
27e90 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
27ea0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
27eb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27ec0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
27ed0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
27ee0 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
27ef0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
27f00 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76  fo->wc;.    pLev
27f10 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75  el->op = OP_Retu
27f20 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  rn;.    pLevel->
27f30 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a  p1 = regReturn;.
27f40 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
27f50 20 6e 65 77 20 53 72 63 4c 69 73 74 20 6e 69 20   new SrcList ni 
27f60 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e  pOrTab containin
27f70 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
27f80 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a  g scanned.    **
27f90 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e   by this loop in
27fa0 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61   the a[0] slot a
27fb0 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20  nd all notReady 
27fc0 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d  tables in a[1..]
27fd0 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
27fe0 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  his becomes the 
27ff0 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65 20 72  SrcList in the r
28000 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20 74 6f  ecursive call to
28010 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
28020 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  in()..    */.   
28030 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
28040 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  vel>1 ){.      i
28050 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20  nt nNotReady;   
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28070 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   The number of n
28080 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73 20 2a  otReady tables *
28090 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  /.      struct S
280a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69  rcList_item *ori
280b0 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69  gSrc;     /* Ori
280c0 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20 74 61  ginal list of ta
280d0 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  bles */.      nN
280e0 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e 66 6f  otReady = pWInfo
280f0 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65  ->nLevel - iLeve
28100 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 4f 72  l - 1;.      pOr
28110 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 74 61  Tab = sqlite3Sta
28120 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  ckAllocRaw(pPars
28130 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61     sizeof(*pOrTa
28160 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69  b)+ nNotReady*si
28170 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30  zeof(pOrTab->a[0
28180 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ]));.      if( p
28190 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  OrTab==0 ) retur
281a0 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20 20 20  n notReady;.    
281b0 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63    pOrTab->nAlloc
281c0 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52 65 61   = (i16)(nNotRea
281d0 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 70  dy + 1);.      p
281e0 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20 70 4f  OrTab->nSrc = pO
281f0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20  rTab->nAlloc;.  
28200 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72 54 61      memcpy(pOrTa
28210 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d 2c 20  b->a, pTabItem, 
28220 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74 65 6d  sizeof(*pTabItem
28230 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67 53 72  ));.      origSr
28240 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  c = pWInfo->pTab
28250 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 66  List->a;.      f
28260 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52  or(k=1; k<=nNotR
28270 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  eady; k++){.    
28280 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f 72 54      memcpy(&pOrT
28290 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69 67 53  ab->a[k], &origS
282a0 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72  rc[pLevel[k].iFr
282b0 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f 72 54  om], sizeof(pOrT
282c0 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20 20 20  ab->a[k]));.    
282d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
282e0 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20 70 57       pOrTab = pW
282f0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
28300 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
28310 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77  itialize the row
28320 73 65 74 20 72 65 67 69 73 74 65 72 20 74 6f 20  set register to 
28330 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e  contain NULL. An
28340 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20   SQL NULL is .  
28350 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
28360 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73  to an empty rows
28370 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  et..    **.    *
28380 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a  * Also initializ
28390 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63  e regReturn to c
283a0 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65  ontain the addre
283b0 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75  ss of the instru
283c0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d  ction .    ** im
283d0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
283e0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72  ing the OP_Retur
283f0 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  n at the bottom 
28400 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69  of the loop. Thi
28410 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75  s.    ** is requ
28420 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62  ired in a few ob
28430 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20  scure LEFT JOIN 
28440 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74  cases where cont
28450 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a  rol jumps.    **
28460 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66   over the top of
28470 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74   the loop into t
28480 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49  he body of it. I
28490 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
284a0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20  .    ** correct 
284b0 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65  response for the
284c0 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64   end-of-loop cod
284d0 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  e (the OP_Return
284e0 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ) is to .    ** 
284f0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
28500 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
28510 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e  tion, just as an
28520 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66   OP_Next does if
28530 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f  .    ** called o
28540 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a  n an uninitializ
28550 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a  ed cursor..    *
28560 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72 6c  /.    if( (wctrl
28570 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 55  Flags & WHERE_DU
28580 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20  PLICATES_OK)==0 
28590 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 73  ){.      regRows
285a0 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
285b0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
285c0 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
285d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
285e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
285f0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
28600 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  Rowset);.    }. 
28610 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20 73 71     iRetInit = sq
28620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28630 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
28640 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
28650 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
28660 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
28670 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
28680 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
28690 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
286a0 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
286b0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
286c0 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65  ur || pOrTerm->e
286d0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
286e0 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
286f0 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f  eInfo *pSubWInfo
28700 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
28710 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52  fo for single OR
28720 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20  -term scan */.  
28730 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
28740 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
28750 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
28760 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
28770 20 20 20 20 20 20 20 20 70 53 75 62 57 49 6e 66          pSubWInf
28780 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
28790 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f  Begin(pParse, pO
287a0 72 54 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  rTab, pOrTerm->p
287b0 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Expr, 0, 0,.    
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f      WHERE_OMIT_O
287e0 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d 49 54  PEN | WHERE_OMIT
287f0 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  _CLOSE |.       
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
28820 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41  LE | WHERE_ONETA
28830 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BLE_ONLY);.     
28840 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
28850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78   ){.          ex
28860 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
28870 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
28880 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
28890 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
288a0 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
288b0 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
288c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
288d0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
288e0 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
288f0 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
28900 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 74 20         int iSet 
28910 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e  = ((ii==pOrWc->n
28920 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a  Term-1)?-1:ii);.
28930 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
28940 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r;.            r
28950 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
28960 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
28970 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  se, pTabItem->pT
28980 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20  ab, -1, iCur, . 
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 69 64          regRowid
289c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
289d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
289e0 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Int(v, OP_RowSet
289f0 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  Test, regRowset,
28a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
28a30 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
28a40 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  , iSet);.       
28a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
28a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28a70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
28a80 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
28a90 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
28aa0 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f  /* The pSubWInfo
28ab0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
28ac0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
28ad0 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20  this OR term.   
28ae0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
28af0 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ned one or more 
28b00 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20  AND term from a 
28b10 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20  notReady table. 
28b20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   The.          *
28b30 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  * terms from the
28b40 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20   notReady table 
28b50 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73  could not be tes
28b60 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20  ted and will.   
28b70 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74         ** need t
28b80 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65  o be tested late
28b90 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  r..          */.
28ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
28bb0 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65  ubWInfo->unteste
28bc0 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65  dTerms ) unteste
28bd0 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20  dTerms = 1;..   
28be0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
28bf0 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67   the loop throug
28c00 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
28c10 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
28c20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
28c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
28c40 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29  reEnd(pSubWInfo)
28c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
28c70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
28c80 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73  1(v, iRetInit, s
28c90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
28ca0 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73  tAddr(v));.    s
28cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28cc0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
28cd0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29  pLevel->addrBrk)
28ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28cf0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
28d00 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
28d10 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c    if( pWInfo->nL
28d20 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33  evel>1 ) sqlite3
28d30 53 74 61 63 6b 46 72 65 65 28 70 50 61 72 73 65  StackFree(pParse
28d40 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20  ->db, pOrTab);. 
28d50 20 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64     if( !untested
28d60 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54  Terms ) disableT
28d70 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
28d80 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  m);.  }else.#end
28d90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28da0 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
28db0 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a  N */..  {.    /*
28dc0 20 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20   Case 5:  There 
28dd0 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64  is no usable ind
28de0 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20  ex.  We must do 
28df0 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  a complete.    *
28e00 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20  *          scan 
28e10 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  of the entire ta
28e20 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
28e30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
28e40 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e  aStep[] = { OP_N
28e50 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a  ext, OP_Prev };.
28e60 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
28e70 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b   u8 aStart[] = {
28e80 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c   OP_Rewind, OP_L
28e90 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  ast };.    asser
28ea0 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52  t( bRev==0 || bR
28eb0 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ev==1 );.    ass
28ec0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
28ed0 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  0 );.    pLevel-
28ee0 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76  >op = aStep[bRev
28ef0 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  ];.    pLevel->p
28f00 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
28f10 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
28f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28f30 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d  (v, aStart[bRev]
28f40 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
28f50 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35  ;.    pLevel->p5
28f60 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
28f70 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
28f80 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61  EP;.  }.  notRea
28f90 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
28fa0 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43  WC->pMaskSet, iC
28fb0 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  ur);..  /* Inser
28fc0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
28fd0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
28fe0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
28ff0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63  ompletely.  ** c
29000 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68  omputed using th
29010 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66  e current set of
29020 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
29030 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
29040 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d 35 30  N-OF: R-49525-50
29050 39 33 35 20 54 65 72 6d 73 20 74 68 61 74 20 63  935 Terms that c
29060 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73 66 69  annot be satisfi
29070 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
29080 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63  the use of indic
29090 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74 73 20  es become tests 
290a0 74 68 61 74 20 61 72 65 20 65 76 61 6c 75 61 74  that are evaluat
290b0 65 64 20 61 67 61 69 6e 73 74 20 65 61 63 68 20  ed against each 
290c0 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  row of.  ** the 
290d0 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74 20 74  relevant input t
290e0 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
290f0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
29100 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
29110 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
29120 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a  {.    Expr *pE;.
29130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
29140 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
29150 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f  ERM_VIRTUAL ); /
29160 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35 2d 31  * IMP: R-30575-1
29170 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65 73 74  1662 */.    test
29180 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46  case( pTerm->wtF
29190 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
291a0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65  D );.    if( pTe
291b0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
291c0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
291d0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
291e0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
291f0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
29200 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
29210 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29220 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
29230 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
29240 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
29250 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
29260 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
29270 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
29280 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
29290 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
292a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
292b0 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
292c0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
292d0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
292e0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
292f0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
29300 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
29310 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
29320 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
29330 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29340 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
29350 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
29360 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
29370 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
29380 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
29390 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
293a0 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f   /* For a LEFT O
293b0 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72  UTER JOIN, gener
293c0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
293d0 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  ll record the fa
293e0 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61 74 20  ct that.  ** at 
293f0 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
29400 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
29410 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
29420 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
29430 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
29440 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
29450 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46     pLevel->addrF
29460 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
29470 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
29480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
294a0 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
294b0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
294c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
294d0 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  , "record LEFT J
294e0 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
294f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29500 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29510 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
29520 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d  ->a, j=0; j<pWC-
29530 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  >nTerm; j++, pTe
29540 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74 65 73  rm++){.      tes
29550 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
29560 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
29570 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  TUAL );  /* IMP:
29580 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
29590 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
295a0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
295b0 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
295c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
295d0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
295e0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
295f0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
29600 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
29610 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
29620 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
29630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29640 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
29650 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
29660 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
29670 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
29680 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
29690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
296a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
296b0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
296c0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
296d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
296e0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
296f0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
29700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
29710 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
29720 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c  Reg(pParse, iRel
29730 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74  easeReg);..  ret
29740 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a  urn notReady;.}.
29750 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
29760 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
29770 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
29780 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
29790 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
297a0 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
297b0 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
297c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
297d0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
297e0 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
297f0 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
29800 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
29810 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
29820 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
29830 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
29840 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
29850 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
29860 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
29870 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
29880 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
29890 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
298a0 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298c0 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
298d0 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
298e0 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
298f0 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
29900 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
29910 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
29920 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29930 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71  whereInfoFree(sq
29940 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
29950 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
29960 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e   if( ALWAYS(pWIn
29970 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fo) ){.    int i
29980 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
29990 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
299a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
299b0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
299c0 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d  *pInfo = pWInfo-
299d0 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[i].pIdxInfo;.
299e0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20        if( pInfo 
299f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73  ){.        /* as
29a00 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65  sert( pInfo->nee
29a10 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30  dToFreeIdxStr==0
29a20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
29a30 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20  iled ); */.     
29a40 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
29a50 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
29a60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
29a70 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
29a80 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
29a90 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
29aa0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e  e3DbFree(db, pIn
29ab0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
29ac0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 61     if( pWInfo->a
29ad0 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [i].plan.wsFlags
29ae0 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
29af0 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 49  DEX ){.        I
29b00 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 57 49  ndex *pIdx = pWI
29b10 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75  nfo->a[i].plan.u
29b20 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 69  .pIdx;.        i
29b30 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
29b40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
29b50 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a 43 6f  ee(db, pIdx->zCo
29b60 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  lAff);.         
29b70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
29b80 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  b, pIdx);.      
29b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29ba0 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  }.    whereClaus
29bb0 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70  eClear(pWInfo->p
29bc0 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  WC);.    sqlite3
29bd0 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
29be0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  o);.  }.}.../*.*
29bf0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
29c00 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
29c10 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
29c20 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
29c30 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
29c40 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
29c50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
29c60 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
29c70 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
29c80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
29c90 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
29ca0 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
29cb0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
29cc0 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
29cd0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
29ce0 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
29cf0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
29d00 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
29d10 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
29d20 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
29d30 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
29d40 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
29d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
29d60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29d70 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
29d80 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
29d90 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
29da0 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
29db0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
29dc0 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
29dd0 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
29de0 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
29df0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
29e00 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
29e10 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
29e20 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
29e30 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
29e40 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
29e50 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
29e60 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
29e70 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
29e80 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
29e90 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
29ea0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
29eb0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
29ec0 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
29ed0 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
29ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
29ef0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
29f00 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
29f10 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
29f20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
29f30 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
29f40 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
29f50 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
29f60 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
29f70 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
29f80 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
29f90 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
29fa0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
29fb0 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
29fc0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
29fd0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
2a000 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
2a010 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a030 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2a040 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
2a050 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
2a060 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
2a070 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
2a080 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
2a090 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
2a0a0 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
2a0b0 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
2a0c0 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
2a0d0 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
2a0e0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
2a0f0 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
2a100 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
2a110 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
2a120 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
2a130 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
2a140 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
2a150 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
2a160 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
2a170 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2a180 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
2a190 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
2a1a0 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
2a1b0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
2a1c0 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
2a1d0 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
2a1e0 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
2a1f0 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
2a200 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
2a210 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
2a220 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
2a230 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
2a240 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
2a250 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
2a260 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
2a270 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
2a280 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
2a290 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
2a2a0 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
2a2b0 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
2a2c0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
2a2d0 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
2a2e0 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
2a2f0 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
2a300 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
2a310 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
2a320 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
2a330 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
2a340 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
2a350 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
2a360 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
2a370 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
2a380 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
2a390 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
2a3a0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
2a3b0 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
2a3c0 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
2a3d0 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
2a3e0 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
2a3f0 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
2a400 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
2a410 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
2a420 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
2a430 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
2a440 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
2a450 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
2a460 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
2a470 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2a480 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
2a490 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
2a4a0 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
2a4b0 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
2a4c0 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
2a4d0 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
2a4e0 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
2a4f0 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
2a500 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
2a510 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
2a520 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2a530 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
2a540 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
2a550 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
2a560 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
2a570 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a580 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
2a590 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
2a5a0 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
2a5b0 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
2a5c0 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
2a5d0 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
2a5e0 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
2a5f0 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
2a600 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a610 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
2a620 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
2a630 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
2a640 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
2a650 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
2a660 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
2a670 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
2a680 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
2a690 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
2a6a0 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
2a6b0 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
2a6c0 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
2a6d0 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
2a6e0 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
2a6f0 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
2a700 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
2a710 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
2a720 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
2a730 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a740 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
2a750 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
2a760 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
2a770 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2a780 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
2a790 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
2a7a0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
2a7b0 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
2a7c0 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
2a7d0 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
2a7e0 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
2a7f0 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
2a800 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
2a810 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
2a820 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
2a830 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
2a840 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
2a850 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
2a860 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
2a870 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
2a880 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
2a890 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2a8a0 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
2a8b0 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
2a8c0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
2a8d0 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
2a8e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
2a8f0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
2a900 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
2a910 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
2a920 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
2a930 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
2a940 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
2a950 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
2a960 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
2a970 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
2a980 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
2a990 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
2a9a0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2a9b0 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
2a9c0 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
2a9d0 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
2a9e0 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
2a9f0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2aa00 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
2aa10 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
2aa20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
2aa30 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
2aa40 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
2aa50 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
2aa60 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
2aa70 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
2aa80 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
2aa90 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
2aaa0 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
2aab0 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
2aac0 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
2aad0 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
2aae0 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
2aaf0 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
2ab00 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
2ab10 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
2ab20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2ab30 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2ab40 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2ab50 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
2ab60 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
2ab70 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
2ab80 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
2ab90 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
2aba0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
2abb0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
2abc0 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c  ist **ppOrderBy,
2abd0 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
2abe0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
2abf0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2ac00 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20 54 68  Distinct,  /* Th
2ac10 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 66 6f  e select-list fo
2ac20 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 69  r DISTINCT queri
2ac30 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  es - or NULL */.
2ac40 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2ac50 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2ac60 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c  f the WHERE_* fl
2ac70 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73  ags defined in s
2ac80 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b  qliteInt.h */.){
2ac90 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2acc0 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66  .  int nByteWInf
2acd0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
2ace0 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f   Num. bytes allo
2acf0 63 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49  cated for WhereI
2ad00 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20  nfo struct */.  
2ad10 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20  int nTabList;   
2ad20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ad30 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
2ad40 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a   in pTabList */.
2ad50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2ad60 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
2ad70 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
2ad80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2ad90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2ada0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2adb0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
2adc0 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
2add0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
2ade0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
2adf0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
2ae00 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
2ae10 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
2ae20 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ned */.  WhereMa
2ae30 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
2ae40 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
2ae50 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
2ae60 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
2ae70 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
2ae80 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
2ae90 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
2aea0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
2aeb0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2aec0 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
2aed0 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   A single entry 
2aee0 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f  from pTabList */
2aef0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
2af00 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
2af10 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
2af20 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e  evel in the pWIn
2af30 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  fo list */.  int
2af40 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2af60 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f  First unused FRO
2af70 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
2af80 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61   */.  int andFla
2af90 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2afa0 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69   /* AND-ed combi
2afb0 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57  nation of all pW
2afc0 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a  C->a[].wtFlags *
2afd0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aff0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2b000 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ction */..  /* T
2b010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
2b020 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2b030 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
2b040 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2b050 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
2b060 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
2b070 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
2b080 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20  List->nSrc==BMS 
2b090 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  );.  if( pTabLis
2b0a0 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
2b0b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b0c0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
2b0d0 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
2b0e0 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
2b0f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2b100 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  }..  /* This fun
2b110 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67  ction normally g
2b120 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73 74 65  enerates a neste
2b130 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74  d loop for all t
2b140 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70  ables in .  ** p
2b150 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20 69 66  TabList.  But if
2b160 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 54 41   the WHERE_ONETA
2b170 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
2b180 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20 73 68   set, then we sh
2b190 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67  ould.  ** only g
2b1a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2b1b0 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
2b1c0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61 6e 64   in pTabList and
2b1d0 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20 20 2a   assume that.  *
2b1e0 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 73  * any cursors as
2b1f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 75  sociated with su
2b200 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 73 20  bsequent tables 
2b210 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  are uninitialize
2b220 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62 4c 69  d..  */.  nTabLi
2b230 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61 67 73  st = (wctrlFlags
2b240 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
2b250 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20 70 54  E_ONLY) ? 1 : pT
2b260 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20  abList->nSrc;.. 
2b270 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
2b280 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
2b290 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
2b2a0 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
2b2b0 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
2b2c0 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69  turn value. A si
2b2d0 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ngle allocation 
2b2e0 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2b2f0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20   the WhereInfo. 
2b300 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20   ** struct, the 
2b310 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72  contents of Wher
2b320 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57  eInfo.a[], the W
2b330 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
2b340 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ture.  ** and th
2b350 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73  e WhereMaskSet s
2b360 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20  tructure. Since 
2b370 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74  WhereClause cont
2b380 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20  ains an 8-byte. 
2b390 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20   ** field (type 
2b3a0 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74  Bitmask) it must
2b3b0 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61   be aligned on a
2b3c0 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
2b3d0 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61  y on.  ** some a
2b3e0 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48 65  rchitectures. He
2b3f0 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29  nce the ROUND8()
2b400 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64   below..  */.  d
2b410 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2b420 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
2b430 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
2b440 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
2b450 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
2b460 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
2b470 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
2b480 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
2b490 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b      nByteWInfo +
2b4a0 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57   .      sizeof(W
2b4b0 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20  hereClause) +.  
2b4c0 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
2b4d0 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20  MaskSet).  );.  
2b4e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2b4f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
2b500 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
2b510 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
2b520 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
2b530 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2b540 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
2b550 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
2b560 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
2b570 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
2b580 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
2b590 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
2b5a0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
2b5b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2b5c0 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f  bel(v);.  pWInfo
2b5d0 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20 28 57  ->pWC = pWC = (W
2b5e0 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28  hereClause *)&((
2b5f0 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79  u8 *)pWInfo)[nBy
2b600 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e  teWInfo];.  pWIn
2b610 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
2b620 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
2b630 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2b640 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
2b650 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
2b660 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65  MaskSet = (Where
2b670 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d  MaskSet*)&pWC[1]
2b680 3b 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  ;..  /* Split th
2b690 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2b6a0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
2b6b0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
2b6c0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
2b6d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
2b6e0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
2b6f0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
2b700 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
2b710 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
2b720 43 6c 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20  ClauseInit(pWC, 
2b730 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
2b740 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b750 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  CodeConstants(pP
2b760 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
2b770 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
2b780 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
2b790 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35  ;   /* IMP: R-15
2b7a0 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20  842-53296 */.   
2b7b0 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
2b7c0 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
2b7d0 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
2b7e0 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
2b7f0 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
2b800 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
2b810 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
2b820 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
2b830 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
2b840 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54 61  ( pWhere && (nTa
2b850 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69  bList==0 || sqli
2b860 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2b870 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
2b880 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2b890 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2b8a0 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
2b8b0 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49  fo->iBreak, SQLI
2b8c0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2b8d0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
2b8e0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e    }..  /* Assign
2b8f0 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20   a bit from the 
2b900 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79  bitmask to every
2b910 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
2b920 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
2b930 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69   ** When assigni
2b940 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65  ng bitmask value
2b950 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65  s to FROM clause
2b960 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73   cursors, it mus
2b970 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61  t be.  ** the ca
2b980 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73 20  se that if X is 
2b990 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2b9a0 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c  the N-th FROM cl
2b9b0 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20  ause term then. 
2b9c0 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20   ** the bitmask 
2b9d0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61  for all FROM cla
2b9e0 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65  use terms to the
2b9f0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74   left of the N-t
2ba00 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28  h term.  ** is (
2ba10 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65  X-1).   An expre
2ba20 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
2ba30 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45  N clause of a LE
2ba40 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a  FT JOIN can use.
2ba50 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52    ** its Expr.iR
2ba60 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61  ightJoinTable va
2ba70 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  lue to find the 
2ba80 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72  bitmask of the r
2ba90 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ight table.  ** 
2baa0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75  of the join.  Su
2bab0 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72  btracting one fr
2bac0 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61 62  om the right tab
2bad0 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73  le bitmask gives
2bae0 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20   a.  ** bitmask 
2baf0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2bb00 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
2bb10 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67  e join.  Knowing
2bb20 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
2bb30 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  * for all tables
2bb40 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2bb50 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69  a left join is i
2bb60 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65  mportant.  Ticke
2bb70 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20  t #3015..  **.  
2bb80 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
2bb90 20 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61   WhereClause.vma
2bba0 73 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74  sk variable so t
2bbb0 68 61 74 20 62 69 74 73 20 74 68 61 74 20 63 6f  hat bits that co
2bbc0 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f  rrespond.  ** to
2bbd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
2bbe0 75 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20  ursors are set. 
2bbf0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
2bc00 73 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61  selectively disa
2bc10 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52  ble .  ** the OR
2bc20 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d  -to-IN transform
2bc30 61 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61  ation in exprAna
2bc40 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74  lyzeOrTerm(). It
2bc50 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20   is not helpful 
2bc60 0a 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75  .  ** with virtu
2bc70 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  al tables..  **.
2bc80 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    ** Note that b
2bc90 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61  itmasks are crea
2bca0 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62  ted for all pTab
2bcb0 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65  List->nSrc table
2bcc0 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69  s in.  ** pTabLi
2bcd0 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65  st, not just the
2bce0 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20   first nTabList 
2bcf0 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73  tables.  nTabLis
2bd00 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20  t is normally.  
2bd10 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62  ** equal to pTab
2bd20 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d  List->nSrc but m
2bd30 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65  ight be shortene
2bd40 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20  d to 1 if the.  
2bd50 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c  ** WHERE_ONETABL
2bd60 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73  E_ONLY flag is s
2bd70 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
2bd80 74 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30  t( pWC->vmask==0
2bd90 20 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d   && pMaskSet->n=
2bda0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
2bdb0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2bdc0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
2bdd0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
2bde0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
2bdf0 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64  .iCursor);.#ifnd
2be00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2be10 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2be20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c  if( ALWAYS(pTabL
2be30 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20  ist->a[i].pTab) 
2be40 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
2be50 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2be60 29 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  ) ){.      pWC->
2be70 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61  vmask |= ((Bitma
2be80 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20  sk)1 << i);.    
2be90 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
2bea0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
2beb0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
2bec0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
2bed0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2bee0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2bef0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
2bf00 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
2bf10 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2bf20 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
2bf30 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
2bf40 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
2bf50 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
2bf60 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
2bf70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
2bf80 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
2bf90 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
2bfa0 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
2bfb0 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
2bfc0 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
2bfd0 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
2bfe0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2bff0 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
2c000 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
2c010 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
2c020 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
2c030 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
2c040 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
2c050 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
2c060 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
2c070 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
2c080 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
2c090 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
2c0a0 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
2c0b0 54 61 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20  TabList, pWC);. 
2c0c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2c0d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2c0e0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2c0f0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  r;.  }..  /* Che
2c100 63 6b 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ck if the DISTIN
2c110 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66  CT qualifier, if
2c120 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69   there is one, i
2c130 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20  s redundant. .  
2c140 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2c150 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63 74 20  n set pDistinct 
2c160 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72  to NULL and Wher
2c170 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20  eInfo.eDistinct 
2c180 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49  to.  ** WHERE_DI
2c190 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f  STINCT_UNIQUE to
2c1a0 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72   tell the caller
2c1b0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44   to ignore the D
2c1c0 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20  ISTINCT..  */.  
2c1d0 69 66 28 20 70 44 69 73 74 69 6e 63 74 20 26 26  if( pDistinct &&
2c1e0 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e   isDistinctRedun
2c1f0 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  dant(pParse, pTa
2c200 62 4c 69 73 74 2c 20 70 57 43 2c 20 70 44 69 73  bList, pWC, pDis
2c210 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44  tinct) ){.    pD
2c220 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2c230 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
2c240 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
2c250 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a  NCT_UNIQUE;.  }.
2c260 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20  .  /* Chose the 
2c270 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73  best index to us
2c280 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
2c290 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c2a0 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  use..  **.  ** T
2c2b0 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69  his loop fills i
2c2c0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2c2d0 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a  fields:.  **.  *
2c2e0 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
2c2f0 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e  pIdx      The in
2c300 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2c310 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  his level of the
2c320 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57   loop..  **   pW
2c330 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67  Info->a[].wsFlag
2c340 73 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c  s   WHERE_xxx fl
2c350 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
2c360 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20  ith pIdx.  **   
2c370 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20  pWInfo->a[].nEq 
2c380 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72        The number
2c390 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f   of == and IN co
2c3a0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20  nstraints.  **  
2c3b0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72   pWInfo->a[].iFr
2c3c0 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72  om     Which ter
2c3d0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
2c3e0 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
2c3f0 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
2c400 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
2c410 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
2c420 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2c430 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
2c440 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
2c450 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
2c460 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
2c470 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ex.  **   pWInfo
2c480 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20  ->a[].pTerm     
2c490 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f  When wsFlags==WO
2c4a0 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75  _OR, the OR-clau
2c4b0 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a  se term.  **.  *
2c4c0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
2c4d0 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
2c4e0 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
2c4f0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
2c500 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
2c510 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
2c520 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2c530 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30  .  andFlags = ~0
2c540 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
2c550 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53  "*** Optimizer S
2c560 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20  tart ***\n"));. 
2c570 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20   for(i=iFrom=0, 
2c580 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2c590 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2c5a0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2c5b0 20 20 57 68 65 72 65 43 6f 73 74 20 62 65 73 74    WhereCost best
2c5c0 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  Plan;         /*
2c5d0 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20   Most efficient 
2c5e0 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72  plan seen so far
2c5f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
2c600 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2c610 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
2c620 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70   FROM table at p
2c630 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69  TabItem */.    i
2c640 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
2c650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2c660 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
2c670 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
2c680 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31    int bestJ = -1
2c690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c6a0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20   The value of j 
2c6b0 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
2c6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c6d0 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61     /* Bitmask va
2c6e0 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73  lue for j or bes
2c6f0 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  tJ */.    int is
2c700 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20  Optimal;        
2c710 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2c720 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f  r for optimal/no
2c730 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68  n-optimal search
2c740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63   */.    int nUnc
2c750 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20  onstrained;     
2c760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61      /* Number ta
2c770 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44  bles without IND
2c780 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42  EXED BY */.    B
2c790 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65  itmask notIndexe
2c7a0 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  d;         /* Ma
2c7b0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  sk of tables tha
2c7c0 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20  t cannot use an 
2c7d0 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65  index */..    me
2c7e0 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
2c7f0 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
2c800 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
2c810 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  an.rCost = SQLIT
2c820 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57  E_BIG_DBL;.    W
2c830 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
2c840 42 65 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72  Begin search for
2c850 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c   loop %d ***\n",
2c860 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   i));..    /* Lo
2c870 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  op through the r
2c880 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73  emaining entries
2c890 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c8a0 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  use to find the.
2c8b0 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74      ** next nest
2c8c0 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f  ed loop. The loo
2c8d0 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d  p tests all FROM
2c8e0 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a   clause entries.
2c8f0 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e      ** either on
2c900 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20  ce or twice. .  
2c910 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2c920 66 69 72 73 74 20 74 65 73 74 20 69 73 20 61 6c  first test is al
2c930 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69  ways performed i
2c940 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
2c950 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a  or more entries.
2c960 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67      ** remaining
2c970 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f   and never perfo
2c980 72 6d 65 64 20 69 66 20 74 68 65 72 65 20 69 73  rmed if there is
2c990 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63   only one FROM c
2c9a0 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20  lause entry.    
2c9b0 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f  ** to choose fro
2c9c0 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 65  m.  The first te
2c9d0 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20  st looks for an 
2c9e0 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20  "optimal" scan. 
2c9f0 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   In.    ** this 
2ca00 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d  context an optim
2ca10 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74  al scan is one t
2ca20 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61 6d  hat uses the sam
2ca30 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a  e strategy.    *
2ca40 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * for the given 
2ca50 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FROM clause entr
2ca60 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65  y as would be se
2ca70 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65 6e  lected if the en
2ca80 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20  try.    ** were 
2ca90 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65  used as the inne
2caa0 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f  rmost nested loo
2cab0 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  p.  In other wor
2cac0 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20  ds, a table.    
2cad0 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63  ** is chosen suc
2cae0 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  h that the cost 
2caf0 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20  of running that 
2cb00 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
2cb10 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62  reduced.    ** b
2cb20 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74  y waiting for ot
2cb30 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75  her tables to ru
2cb40 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73 20 22  n first.  This "
2cb50 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f  optimal" test wo
2cb60 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69  rks.    ** by fi
2cb70 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61  rst assuming tha
2cb80 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  t the FROM claus
2cb90 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65  e is on the inne
2cba0 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69  r loop and findi
2cbb0 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75  ng.    ** its qu
2cbc0 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63  ery plan, then c
2cbd0 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69  hecking to see i
2cbe0 66 20 74 68 61 74 20 71 75 65 72 79 20 70 6c 61  f that query pla
2cbf0 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a  n uses any.    *
2cc00 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  * other FROM cla
2cc10 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 61  use terms that a
2cc20 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66  re notReady.  If
2cc30 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72   no notReady ter
2cc40 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73  ms are.    ** us
2cc50 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74  ed then the "opt
2cc60 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e  imal" query plan
2cc70 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20   works..    **. 
2cc80 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2cc90 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52  the WhereCost.nR
2cca0 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  ow parameter for
2ccb0 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
2ccc0 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f   might.    ** no
2ccd0 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73  t be as small as
2cce0 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20   it would be if 
2ccf0 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79  the table really
2cd00 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d   were the innerm
2cd10 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e  ost.    ** join.
2cd20 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
2cd30 20 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 20   can be reduced 
2cd40 62 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  by WHERE clause 
2cd50 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
2cd60 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ** that do not u
2cd70 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74  se indices.  But
2cd80 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63   this nRow reduc
2cd90 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e  tion only happen
2cda0 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s if the.    ** 
2cdb0 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  table really is 
2cdc0 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f  the innermost jo
2cdd0 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  in.  .    **.   
2cde0 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c   ** The second l
2cdf0 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73  oop iteration is
2ce00 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20   only performed 
2ce10 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63  if no optimal sc
2ce20 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65  an.    ** strate
2ce30 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20  gies were found 
2ce40 62 79 20 74 68 65 20 66 69 72 73 74 20 69 74 65  by the first ite
2ce50 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63  ration. This sec
2ce60 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20  ond iteration.  
2ce70 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20    ** is used to 
2ce80 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c  search for the l
2ce90 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20  owest cost scan 
2cea0 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a  overall..    **.
2ceb0 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20      ** Previous 
2cec0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2ced0 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c  te performed onl
2cee0 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65  y the second ite
2cef0 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20  ration -.    ** 
2cf00 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f  the next outermo
2cf10 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61  st loop was alwa
2cf20 79 73 20 74 68 61 74 20 77 69 74 68 20 74 68 65  ys that with the
2cf30 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a   lowest overall.
2cf40 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77      ** cost. How
2cf50 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74  ever, this meant
2cf60 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75   that SQLite cou
2cf70 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20 77 72  ld select the wr
2cf80 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20  ong plan.    ** 
2cf90 66 6f 72 20 73 63 72 69 70 74 73 20 73 75 63 68  for scripts such
2cfa0 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   as the followin
2cfb0 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20  g:.    **   .   
2cfc0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
2cfd0 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20  LE t1(a, b); .  
2cfe0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
2cff0 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20  BLE t2(c, d);.  
2d000 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20    **   SELECT * 
2d010 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52  FROM t2, t1 WHER
2d020 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e  E t2.rowid = t1.
2d030 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  a;.    **.    **
2d040 20 54 68 65 20 62 65 73 74 20 73 74 72 61 74 65   The best strate
2d050 67 79 20 69 73 20 74 6f 20 69 74 65 72 61 74 65  gy is to iterate
2d060 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74   through table t
2d070 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72  1 first. However
2d080 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
2d090 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  t possible to de
2d0a0 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74  termine this wit
2d0b0 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64  h a simple greed
2d0c0 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20  y algorithm..   
2d0d0 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   ** Since the co
2d0e0 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
2d0f0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
2d100 65 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65  e t2 is the same
2d110 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20   .    ** as the 
2d120 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
2d130 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
2d140 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65  ble t1, a simple
2d150 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20   greedy .    ** 
2d160 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68  algorithm may ch
2d170 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66  oose to use t2 f
2d180 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  or the outer loo
2d190 70 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75  p, which is a mu
2d1a0 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69  ch.    ** costli
2d1b0 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20  er approach..   
2d1c0 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74   */.    nUnconst
2d1d0 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20  rained = 0;.    
2d1e0 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a  notIndexed = 0;.
2d1f0 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61      for(isOptima
2d200 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73  l=(iFrom<nTabLis
2d210 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e  t-1); isOptimal>
2d220 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69  =0 && bestJ<0; i
2d230 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20  sOptimal--){.   
2d240 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b     Bitmask mask;
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d260 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e  Mask of tables n
2d270 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a  ot yet ready */.
2d280 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f        for(j=iFro
2d290 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61  m, pTabItem=&pTa
2d2a0 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e  bList->a[j]; j<n
2d2b0 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54  TabList; j++, pT
2d2c0 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20  abItem++){.     
2d2d0 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72     int doNotReor
2d2e0 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  der;    /* True 
2d2f0 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73 68  if this table sh
2d300 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72  ould not be reor
2d310 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
2d320 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74   WhereCost sCost
2d330 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e  ;     /* Cost in
2d340 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
2d350 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65  est[Virtual]Inde
2d360 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  x() */.        E
2d370 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2d380 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  y;  /* ORDER BY 
2d390 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78  clause for index
2d3a0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a   to optimize */.
2d3b0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2d3c0 20 2a 70 44 69 73 74 3b 20 20 20 20 20 2f 2a 20   *pDist;     /* 
2d3d0 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
2d3e0 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74  for index to opt
2d3f0 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20  imize */.  .    
2d400 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
2d410 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
2d420 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2d430 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2d440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 21  ;.        if( j!
2d450 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52  =iFrom && doNotR
2d460 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
2d470 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d          m = getM
2d480 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
2d490 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
2d4a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  ;.        if( (m
2d4b0 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
2d4c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d4d0 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f   j==iFrom ) iFro
2d4e0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  m++;.          c
2d4f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d500 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20   }.        mask 
2d510 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d  = (isOptimal ? m
2d520 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20   : notReady);.  
2d530 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
2d540 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64   ((i==0 && ppOrd
2d550 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42  erBy )?*ppOrderB
2d560 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44  y:0);.        pD
2d570 69 73 74 20 3d 20 28 69 3d 3d 30 20 3f 20 70 44  ist = (i==0 ? pD
2d580 69 73 74 69 6e 63 74 20 3a 20 30 29 3b 0a 20 20  istinct : 0);.  
2d590 20 20 20 20 20 20 69 66 28 20 70 54 61 62 49 74        if( pTabIt
2d5a0 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20  em->pIndex==0 ) 
2d5b0 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b  nUnconstrained++
2d5c0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57 48 45  ;.  .        WHE
2d5d0 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72  RETRACE(("=== tr
2d5e0 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69  ying table %d wi
2d5f0 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20  th isOptimal=%d 
2d600 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ===\n",.        
2d610 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69              j, i
2d620 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20  sOptimal));.    
2d630 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2d640 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69  Item->pTab );.#i
2d650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d660 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
2d670 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
2d680 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
2d690 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2d6a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
2d6b0 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49  info **pp = &pWI
2d6c0 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
2d6d0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65  fo;.          be
2d6e0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
2d6f0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
2d700 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52  Item, mask, notR
2d710 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a  eady, pOrderBy,.
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d730 20 20 20 20 20 20 20 20 20 20 20 26 73 43 6f 73             &sCos
2d740 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20  t, pp);.        
2d750 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20  }else .#endif.  
2d760 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d770 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
2d780 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2d790 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f  abItem, mask, no
2d7a0 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
2d7b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d7c0 70 44 69 73 74 2c 20 26 73 43 6f 73 74 29 3b 0a  pDist, &sCost);.
2d7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d7e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 74 69    assert( isOpti
2d7f0 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73  mal || (sCost.us
2d800 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20  ed&notReady)==0 
2d810 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  );..        /* I
2d820 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  f an INDEXED BY 
2d830 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
2d840 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c 61 6e  t, then the plan
2d850 20 6d 75 73 74 20 75 73 65 20 74 68 61 74 0a 20   must use that. 
2d860 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
2d870 69 66 20 69 74 20 75 73 65 73 20 61 6e 79 20 69  if it uses any i
2d880 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20  ndex at all */. 
2d890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2d8a0 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d  TabItem->pIndex=
2d8b0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2d8c0 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e        || (sCost.
2d8d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2d8e0 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41  HERE_NOT_FULLSCA
2d8f0 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  N)==0.          
2d900 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f 73 74          || sCost
2d910 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54  .plan.u.pIdx==pT
2d920 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29  abItem->pIndex )
2d930 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ;..        if( i
2d940 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73 43 6f  sOptimal && (sCo
2d950 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2d960 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2d970 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SCAN)==0 ){.    
2d980 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64        notIndexed
2d990 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d   |= m;.        }
2d9a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ..        /* Con
2d9b0 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68  ditions under wh
2d9c0 69 63 68 20 74 68 69 73 20 74 61 62 6c 65 20 62  ich this table b
2d9d0 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20  ecomes the best 
2d9e0 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20  so far:.        
2d9f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2da00 28 31 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75  (1) The table mu
2da10 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e  st not depend on
2da20 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 68   other tables th
2da30 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20  at have not.    
2da40 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74      **       yet
2da50 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a   run..        **
2da60 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32  .        **   (2
2da70 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73  ) A full-table-s
2da80 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20  can plan cannot 
2da90 73 75 70 65 72 63 65 64 65 20 69 6e 64 65 78 65  supercede indexe
2daa0 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20  d plan unless.  
2dab0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74        **       t
2dac0 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63  he full-table-sc
2dad0 61 6e 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61  an is an "optima
2dae0 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e  l" plan as defin
2daf0 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
2db00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2db10 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73    (3) All tables
2db20 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44   have an INDEXED
2db30 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68   BY clause or th
2db40 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61  is table lacks a
2db50 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  n.        **    
2db60 20 20 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c     INDEXED BY cl
2db70 61 75 73 65 20 6f 72 20 74 68 69 73 20 74 61 62  ause or this tab
2db80 6c 65 20 75 73 65 73 20 74 68 65 20 73 70 65 63  le uses the spec
2db90 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20  ific.        ** 
2dba0 20 20 20 20 20 20 69 6e 64 65 78 20 73 70 65 63        index spec
2dbb0 69 66 69 65 64 20 62 79 20 69 74 73 20 49 4e 44  ified by its IND
2dbc0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20  EXED BY clause. 
2dbd0 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72   This rule ensur
2dbe0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  es.        **   
2dbf0 20 20 20 20 74 68 61 74 20 61 20 62 65 73 74 2d      that a best-
2dc00 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73  so-far is always
2dc10 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69   selected even i
2dc20 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a  f an impossible.
2dc30 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2dc40 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
2dc50 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2dc60 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54  es are given.  T
2dc70 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
2dc80 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62   **       will b
2dc90 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
2dca0 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74  elayed back to t
2dcb0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c  he application l
2dcc0 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ater..        **
2dcd0 20 20 20 20 20 20 20 54 68 65 20 4e 45 56 45 52         The NEVER
2dce0 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62  () comes about b
2dcf0 65 63 61 75 73 65 20 72 75 6c 65 20 28 32 29 20  ecause rule (2) 
2dd00 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20  above prevents. 
2dd10 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20         **       
2dd20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c  An indexable ful
2dd30 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f  l-table-scan fro
2dd40 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20  m reaching rule 
2dd50 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  (3)..        **.
2dd60 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29          **   (4)
2dd70 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d   The plan cost m
2dd80 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61  ust be lower tha
2dd90 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72  n prior plans or
2dda0 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20   else the.      
2ddb0 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20    **       cost 
2ddc0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
2ddd0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
2dde0 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20  of rows must be 
2ddf0 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  lower..        *
2de00 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 73  /.        if( (s
2de10 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61  Cost.used&notRea
2de20 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  dy)==0          
2de30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2de40 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
2de50 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c     && (bestJ<0 |
2de60 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29  | (notIndexed&m)
2de70 21 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  !=0             
2de80 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
2de90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2dea0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2deb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2dec0 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20  T_FULLSCAN)==0. 
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2dee0 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73  | (sCost.plan.ws
2def0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f  Flags & WHERE_NO
2df00 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a  T_FULLSCAN)!=0).
2df10 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2df20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d  nUnconstrained==
2df30 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70  0 || pTabItem->p
2df40 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33  Index==0   /* (3
2df50 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2df60 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73       || NEVER((s
2df70 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2df80 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2df90 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20  LLSCAN)!=0)).   
2dfa0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 65 73           && (bes
2dfb0 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43  tJ<0 || sCost.rC
2dfc0 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f  ost<bestPlan.rCo
2dfd0 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a  st      /* (4) *
2dfe0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2dff0 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73    || (sCost.rCos
2e000 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73  t<=bestPlan.rCos
2e010 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
2e020 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61      && sCost.pla
2e030 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e  n.nRow<bestPlan.
2e040 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20  plan.nRow)).    
2e050 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2e060 20 57 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d   WHERETRACE(("==
2e070 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20 62 65  = table %d is be
2e080 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20  st so far".     
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0a0 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2e0b0 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72        j, sCost.r
2e0e0 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e  Cost, sCost.plan
2e0f0 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20  .nRow));.       
2e100 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43     bestPlan = sC
2e110 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ost;.          b
2e120 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
2e130 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e140 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
2e150 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2e160 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e170 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20  bestJ>=0 );.    
2e180 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79  assert( notReady
2e190 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   & getMask(pMask
2e1a0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
2e1b0 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29  [bestJ].iCursor)
2e1c0 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41   );.    WHERETRA
2e1d0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
2e1e0 65 72 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65  er selects table
2e1f0 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22   %d for loop %d"
2e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e210 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20   " with cost=%g 
2e220 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a  and nRow=%g\n",.
2e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e240 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57  bestJ, pLevel-pW
2e250 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61  Info->a, bestPla
2e260 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61  n.rCost, bestPla
2e270 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20  n.plan.nRow));. 
2e280 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2e290 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e2a0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d  WHERE_ORDERBY)!=
2e2b0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72  0 ){.      *ppOr
2e2c0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
2e2d0 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c  .    if( (bestPl
2e2e0 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2e2f0 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  & WHERE_DISTINCT
2e300 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
2e310 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44  sert( pWInfo->eD
2e320 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
2e330 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
2e340 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
2e350 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a  STINCT_ORDERED;.
2e360 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
2e370 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
2e380 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
2e390 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
2e3a0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
2e3b0 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73     testcase( bes
2e3c0 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
2e3d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
2e3e0 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ED );.    testca
2e3f0 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  se( bestPlan.pla
2e400 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e410 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a  E_TEMP_INDEX );.
2e420 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2e430 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e440 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2e450 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
2e460 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
2e470 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
2e480 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2e490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
2e4a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
2e4b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
2e4c0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
2e4d0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2e4e0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
2e4f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
2e500 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38  vel->iFrom = (u8
2e510 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20  )bestJ;.    if( 
2e520 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52  bestPlan.plan.nR
2e530 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b  ow>=(double)1 ){
2e540 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2e550 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73  QueryLoop *= bes
2e560 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b  tPlan.plan.nRow;
2e570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e580 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65  heck that if the
2e590 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62   table scanned b
2e5a0 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  y this loop iter
2e5b0 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20  ation had an.   
2e5c0 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63   ** INDEXED BY c
2e5d0 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
2e5e0 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e  o it, that the n
2e5f0 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62 65  amed index is be
2e600 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  ing.    ** used 
2e610 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66  for the scan. If
2e620 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79   not, then query
2e630 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73   compilation has
2e640 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   failed..    ** 
2e650 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  Return an error.
2e660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78  .    */.    pIdx
2e670 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62   = pTabList->a[b
2e680 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20  estJ].pIndex;.  
2e690 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
2e6a0 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61      if( (bestPla
2e6b0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2e6c0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
2e6d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2e6e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e6f0 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73  arse, "cannot us
2e700 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49  e index: %s", pI
2e710 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2e720 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
2e730 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  ginError;.      
2e740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2e750 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20  * If an INDEXED 
2e760 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73 65  BY clause is use
2e770 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  d, the bestIndex
2e780 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  () function is. 
2e790 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
2e7a0 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  teed to find the
2e7b0 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65 64   index specified
2e7c0 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20   in the INDEXED 
2e7d0 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  BY clause.      
2e7e0 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20    ** if it find 
2e7f0 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e  an index at all.
2e800 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2e810 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61  rt( bestPlan.pla
2e820 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29  n.u.pIdx==pIdx )
2e830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e840 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
2e850 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2e860 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
2e870 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ));.  if( pParse
2e880 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
2e890 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2e8a0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2e8b0 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f  nError;.  }..  /
2e8c0 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
2e8d0 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
2e8e0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
2e8f0 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
2e900 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
2e910 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
2e920 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
2e930 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
2e940 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
2e950 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
2e960 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
2e970 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  /* If the caller
2e980 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
2e990 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2e9a0 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73  t that is reques
2e9b0 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65  ting.  ** to use
2e9c0 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f   a one-pass algo
2e9d0 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65  rithm, determine
2e9e0 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72   if this is appr
2e9f0 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68  opriate..  ** Th
2ea00 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  e one-pass algor
2ea10 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  ithm only works 
2ea20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
2ea30 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
2ea40 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2ea50 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20 73  nt to update a s
2ea60 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a  ingle row..  */.
2ea70 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c    assert( (wctrl
2ea80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2ea90 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2eaa0 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  0 || pWInfo->nLe
2eab0 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  vel==1 );.  if( 
2eac0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2ead0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2eae0 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46  RED)!=0 && (andF
2eaf0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
2eb00 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  QUE)!=0 ){.    p
2eb10 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
2eb20 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f   = 1;.    pWInfo
2eb30 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c  ->a[0].plan.wsFl
2eb40 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44  ags &= ~WHERE_ID
2eb50 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  X_ONLY;.  }..  /
2eb60 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
2eb70 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
2eb80 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
2eb90 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
2eba0 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
2ebb0 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2ebc0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
2ebd0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2ebe0 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
2ebf0 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
2ec00 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
2ec10 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
2ec20 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f  mask)0;.  pWInfo
2ec30 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75  ->nRowOut = (dou
2ec40 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d 30  ble)1;.  for(i=0
2ec50 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2ec60 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
2ec70 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2ec80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2ec90 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
2eca0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
2ecb0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
2ecc0 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
2ecd0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
2ece0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ble/index */..  
2ecf0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
2ed00 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
2ed10 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
2ed20 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
2ed30 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  Tab;.    pLevel-
2ed40 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
2ed50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2ed60 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2ed70 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  t *= pLevel->pla
2ed80 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20  n.nRow;.    iDb 
2ed90 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2eda0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2edb0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
2edc0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
2edd0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
2ede0 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70  l)!=0 || pTab->p
2edf0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
2ee00 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2ee10 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64  .    }else.#ifnd
2ee20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2ee30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2ee40 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2ee50 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2ee60 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
2ee70 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
2ee80 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
2ee90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2eea0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
2eeb0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
2eec0 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
2eed0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2eee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2eef0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
2ef00 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
2ef10 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
2ef20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2ef30 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2ef40 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2ef50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2ef60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2ef70 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2ef80 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
2ef90 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2efa0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
2efb0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
2efc0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
2efd0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
2efe0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2eff0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
2f000 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
2f010 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
2f020 63 61 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  case( pTab->nCol
2f030 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2f040 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 2d   testcase( pTab-
2f050 3e 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nCol==BMS );.  
2f060 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
2f070 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54  >okOnePass && pT
2f080 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a  ab->nCol<BMS ){.
2f090 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
2f0a0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
2f0b0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
2f0c0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
2f0d0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
2f0e0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
2f0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f100 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33  ngeP4(v, sqlite3
2f110 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f120 76 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  v)-1, .         
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f140 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
2f150 5f 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33  _PTR(n), P4_INT3
2f160 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  2);.        asse
2f170 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
2f180 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
2f190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2f1a0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2f1b0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2f1c0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2f1d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  >zName);.    }.#
2f1e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f1f0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
2f200 45 58 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  EX.    if( (pLev
2f210 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f220 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e   & WHERE_TEMP_IN
2f230 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  DEX)!=0 ){.     
2f240 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61   constructAutoma
2f250 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
2f260 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2f270 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c  notReady, pLevel
2f280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
2f290 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
2f2a0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2f2b0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
2f2c0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
2f2d0 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
2f2e0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
2f2f0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2f300 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
2f310 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
2f320 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
2f330 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
2f340 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
2f350 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
2f360 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
2f370 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
2f380 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
2f390 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
2f3a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f3b0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2f3c0 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
2f3d0 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3f0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
2f400 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
2f410 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f420 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2f430 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
2f440 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
2f450 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2f460 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2f470 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
2f480 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53  Mask(pWC->pMaskS
2f490 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  et, pTabItem->iC
2f4a0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57  ursor);.  }.  pW
2f4b0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2f4c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2f4d0 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2f4e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2f4f0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2f500 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2f510 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2f520 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2f530 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2f540 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2f550 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2f560 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2f570 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2f580 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2f590 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2f5a0 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2f5b0 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2f5c0 28 69 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74  (i=0; i<nTabList
2f5d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76  ; i++){.    pLev
2f5e0 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
2f5f0 69 5d 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f  i];.    explainO
2f600 6e 65 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70  neScan(pParse, p
2f610 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2f620 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
2f630 6d 2c 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  m, wctrlFlags);.
2f640 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63      notReady = c
2f650 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28  odeOneLoopStart(
2f660 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c  pWInfo, i, wctrl
2f670 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29  Flags, notReady)
2f680 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2f690 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2f6a0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ->addrCont;.  }.
2f6b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2f6c0 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
2f6d0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
2f6e0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
2f6f0 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
2f700 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
2f710 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2f720 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
2f730 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
2f740 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
2f750 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
2f760 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
2f770 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
2f780 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
2f790 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
2f7a0 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
2f7b0 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
2f7c0 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
2f7d0 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
2f7e0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
2f7f0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
2f800 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
2f810 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54  .  for(i=0; i<nT
2f820 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  abList; i++){.  
2f830 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
2f840 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
2f850 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2f860 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
2f870 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
2f880 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
2f890 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
2f8a0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
2f8b0 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
2f8c0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2f8d0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
2f8e0 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
2f8f0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2f900 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2f910 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29  query_plan)-10 )
2f920 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  {.      if( pLev
2f930 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
2f940 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2f950 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Y ){.        mem
2f960 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
2f970 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
2f980 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20   "{}", 2);.     
2f990 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
2f9a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f9b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2f9c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2f9d0 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a  nQPlan], z, n);.
2f9e0 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
2f9f0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
2fa00 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79     sqlite3_query
2fa10 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20  _plan[nQPlan++] 
2fa20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = ' ';.    }.   
2fa30 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
2fa40 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2fa50 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  & WHERE_ROWID_EQ
2fa60 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2fa70 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
2fa80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
2fa90 4f 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20  OWID_RANGE );.  
2faa0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
2fab0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48  an.wsFlags & (WH
2fac0 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
2fad0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
2fae0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2faf0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2fb00 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
2fb10 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
2fb20 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
2fb30 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d  lse if( (pLevel-
2fb40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2fb50 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2fb60 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  0 ){.      n = s
2fb70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
2fb80 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
2fb90 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
2fba0 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
2fbb0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
2fbc0 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
2fbd0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2fbe0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
2fbf0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
2fc00 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
2fc10 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
2fc20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
2fc30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fc40 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
2fc50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
2fc60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2fc70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
2fc80 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2fc90 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
2fca0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
2fcb0 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  an += 3;.    }. 
2fcc0 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
2fcd0 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
2fce0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2fcf0 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
2fd00 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2fd10 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
2fd20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2fd30 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2fd40 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
2fd50 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
2fd60 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
2fd70 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
2fd80 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
2fd90 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
2fda0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
2fdb0 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
2fdc0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
2fdd0 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
2fde0 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
2fdf0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  rn..  */.  retur
2fe00 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
2fe10 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
2fe20 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
2fe30 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
2fe40 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
2fe50 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2fe60 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2fe70 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2fe80 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
2fe90 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2fea0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2feb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2fec0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2fed0 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
2fee0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
2fef0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2ff00 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
2ff10 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2ff20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ff30 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
2ff40 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
2ff50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2ff60 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2ff70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2ff80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2ff90 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
2ffa0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
2ffb0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
2ffc0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
2ffd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ffe0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2fff0 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70  /* Generate loop
30000 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
30010 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
30020 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
30030 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
30040 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
30050 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
30060 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
30070 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
30080 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30090 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
300a0 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  ->addrCont);.   
300b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
300c0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
300d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
300e0 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
300f0 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
30100 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
30110 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
30120 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d  ngeP5(v, pLevel-
30130 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >p5);.    }.    
30140 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
30150 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
30160 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76  _IN_ABLE && pLev
30170 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29  el->u.in.nIn>0 )
30180 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49  {.      struct I
30190 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20  nLoop *pIn;.    
301a0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
301b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
301c0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
301d0 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  ->addrNxt);.    
301e0 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e    for(j=pLevel->
301f0 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70  u.in.nIn, pIn=&p
30200 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
30210 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
30220 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
30230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
30240 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
30250 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20  addrInTop+1);.  
30260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
30280 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70  xt, pIn->iCur, p
30290 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a  In->addrInTop);.
302a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
302b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
302c0 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29  In->addrInTop-1)
302d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
302e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
302f0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
30300 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
30310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30320 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
30330 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
30340 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30350 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
30360 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
30370 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
30380 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30390 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d  P_IfPos, pLevel-
303a0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
303b0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
303c0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
303d0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
303e0 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
303f0 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61   || (pLevel->pla
30400 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
30410 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
30420 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
30430 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30440 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
30450 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)==0 ){.       
30460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30470 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
30480 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
30490 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
304a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
304b0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
304c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
304d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
304e0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
304f0 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
30500 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30510 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
30520 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
30530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30540 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
30550 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
30560 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
30570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
305a0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
305b0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
305c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
305d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
305e0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
305f0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
30600 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
30610 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
30620 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
30630 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
30640 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
30650 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30660 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
30670 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
30680 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
30690 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
306a0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
306b0 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
306c0 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
306d0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20  o->nLevel==1 || 
306e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
306f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
30700 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
30710 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
30720 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
30730 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
30740 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
30750 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
30760 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
30770 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
30780 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
30790 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
307a0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
307b0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
307c0 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
307d0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
307e0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54  l)==0.     && pT
307f0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20  ab->pSelect==0. 
30800 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
30810 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
30820 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d  RE_OMIT_CLOSE)==
30830 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
30840 6e 74 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e  nt ws = pLevel->
30850 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
30860 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d      if( !pWInfo-
30870 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77  >okOnePass && (w
30880 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
30890 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
308a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
308b0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
308c0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
308d0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
308e0 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48 45     if( (ws & WHE
308f0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
30900 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 54 45  & (ws & WHERE_TE
30910 4d 50 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a  MP_INDEX)==0 ){.
30920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30930 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30940 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
30950 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
30960 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30970 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
30980 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
30990 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
309a0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
309b0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
309c0 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65  index in prefere
309d0 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nce to the table
309e0 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69  . Sometimes, thi
309f0 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  s means.    ** t
30a00 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65  he table need ne
30a10 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ver be read from
30a20 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66  . This is a perf
30a30 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20  ormance boost,. 
30a40 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62     ** as the vdb
30a50 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e  e level waits un
30a60 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73  til the table is
30a70 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74   read before act
30a80 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65  ually.    ** see
30a90 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63  king the table c
30aa0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63  ursor to the rec
30ab0 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ord correspondin
30ac0 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
30ad0 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
30ae0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
30af0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
30b00 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
30b10 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
30b20 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
30b30 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
30b40 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
30b50 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
30b60 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
30b70 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
30b80 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
30b90 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
30ba0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
30bb0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
30bc0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
30bd0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
30be0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
30bf0 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
30c00 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
30c10 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
30c20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
30c30 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
30c40 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
30c50 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
30c60 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
30c70 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74  iled){.      int
30c80 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
30c90 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
30ca0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
30cb0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
30cc0 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20  .u.pIdx;..      
30cd0 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
30ce0 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
30cf0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
30d00 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
30d10 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
30d20 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30d30 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
30d40 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
30d50 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
30d60 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
30d70 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
30d80 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
30d90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30da0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
30db0 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
30dc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
30dd0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
30de0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
30df0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
30e00 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
30e10 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
30e20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
30e30 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
30e40 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
30e50 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
30e60 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30e80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30e90 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c       assert( (pL
30ea0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
30eb0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
30ec0 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
30ed0 20 20 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78         || j<pIdx
30ee0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
30ef0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
30f00 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
30f10 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
30f20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
30f30 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
30f40 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
30f50 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
30f60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
30f80 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
30f90 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  p.  */.  pParse-
30fa0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
30fb0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
30fc0 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e  yLoop;.  whereIn
30fd0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
30fe0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.