/ Hex Artifact Content
Login

Artifact 2112422a404dcca5d47f6630bdf180bccd36c62b:


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 33 0a 23 20  _ENABLE_STAT3.# 
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 33 20 2a 2f 0a 23 65  sing stat3 */.#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 2a 0a 2a 2a 20  ereTerms..**.** 
15f0: 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 70  Explanation of p
1600: 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57 48  Outer:  For a WH
1610: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
1620: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
1630: 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28 62         a AND ((b
1640: 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41 4e   AND c) OR (d AN
1650: 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a 2a  D e)) AND f.**.*
1660: 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70 61  * There are sepa
1670: 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73 65  rate WhereClause
1680: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68 65   objects for the
1690: 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61 6e   whole clause an
16a0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75 62  d for.** the sub
16b0: 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44 20  clauses "(b AND 
16c0: 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44 20  c)" and "(d AND 
16d0: 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65 72  e)".  The pOuter
16e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a   field of the.**
16f0: 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69 6e   subclauses poin
1700: 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ts to the WhereC
1710: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f 72  lause object for
1720: 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75 73   the whole claus
1730: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1740: 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72  reClause {.  Par
1750: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1770: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1780: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
1790: 4d 61 73 6b 53 65 74 3b 20 20 2f 2a 20 4d 61 70  MaskSet;  /* Map
17a0: 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 63 75  ping of table cu
17b0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74 6f 20  rsor numbers to 
17c0: 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 42 69  bitmasks */.  Bi
17d0: 74 6d 61 73 6b 20 76 6d 61 73 6b 3b 20 20 20 20  tmask vmask;    
17e0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73         /* Bitmas
17f0: 6b 20 69 64 65 6e 74 69 66 79 69 6e 67 20 76 69  k identifying vi
1800: 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
1810: 6f 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ors */.  WhereCl
1820: 61 75 73 65 20 2a 70 4f 75 74 65 72 3b 20 20 20  ause *pOuter;   
1830: 20 20 2f 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75    /* Outer conju
1840: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f  nction */.  u8 o
1850: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1860: 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70       /* Split op
1870: 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20  erator.  TK_AND 
1880: 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20 75 31  or TK_OR */.  u1
1890: 36 20 77 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  6 wctrlFlags;   
18a0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
18b0: 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f 41 4e  include WHERE_AN
18c0: 44 5f 4f 4e 4c 59 20 2a 2f 0a 20 20 69 6e 74 20  D_ONLY */.  int 
18d0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
18e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18f0: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
1900: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
1910: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1920: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
1930: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1940: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1950: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
1960: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
1970: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
1980: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1990: 53 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41  SQLITE_SMALL_STA
19a0: 43 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20  CK).  WhereTerm 
19b0: 61 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f  aStatic[1];    /
19c0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
19d0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
19e0: 2f 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54  /.#else.  WhereT
19f0: 65 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20  erm aStatic[8]; 
1a00: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
1a10: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
1a20: 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [] */.#endif.};.
1a30: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
1a40: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
1a50: 72 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73  r==WO_OR has its
1a60: 20 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74   u.pOrInfo point
1a70: 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64  er set to.** a d
1a80: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1a90: 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66  ated instance of
1aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1ab0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1ac0: 75 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  uct WhereOrInfo 
1ad0: 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1ae0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  wc;          /* 
1af0: 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e  Decomposition in
1b00: 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20  to subterms */. 
1b10: 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62   Bitmask indexab
1b20: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74  le;       /* Bit
1b30: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65  mask of all inde
1b40: 78 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20  xable tables in 
1b50: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b  the clause */.};
1b60: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54  ../*.** A WhereT
1b70: 65 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74  erm with eOperat
1b80: 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69  or==WO_AND has i
1b90: 74 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f  ts u.pAndInfo po
1ba0: 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20  inter set to.** 
1bb0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
1bc0: 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65  located instance
1bd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1be0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
1bf0: 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49  struct WhereAndI
1c00: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
1c10: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
1c20: 20 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65   /* The subexpre
1c30: 73 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74  ssion broken out
1c40: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
1c50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1c60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1c70: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
1c80: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
1c90: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
1ca0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
1cb0: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
1cc0: 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65  masks in WhereTe
1cd0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  rm..**.** The VD
1ce0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1cf0: 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65  s are small inte
1d00: 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  gers contained i
1d10: 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74  n .** SrcList_it
1d20: 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45  em.iCursor and E
1d30: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
1d40: 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65  s.  For any give
1d50: 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75  n WHERE .** clau
1d60: 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e  se, the cursor n
1d70: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74  umbers might not
1d80: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
1d90: 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20  d they might.** 
1da0: 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20  contain gaps in 
1db0: 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65  the numbering se
1dc0: 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20  quence.  But we 
1dd0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78  want to make max
1de0: 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74  imum.** use of t
1df0: 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62  he bits in our b
1e00: 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73  itmasks.  This s
1e10: 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65  tructure provide
1e20: 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66  s a mapping.** f
1e30: 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63  rom the sparse c
1e40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1e50: 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69  to consecutive i
1e60: 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e  ntegers beginnin
1e70: 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a  g.** with 0..**.
1e80: 2a 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53  ** If WhereMaskS
1e90: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1ea0: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1eb0: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1ec0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1ed0: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1ee0: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1ef0: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1f00: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
1f10: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1f20: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
1f30: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
1f40: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
1f50: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
1f60: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1f70: 20 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72    Then the  Wher
1f80: 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
1f90: 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20  re.** would map 
1fa0: 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d  those cursor num
1fb0: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30  bers into bits 0
1fc0: 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a   through 5..**.*
1fd0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1fe0: 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e  mapping is not n
1ff0: 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72  ecessarily order
2000: 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d  ed.  In the exam
2010: 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ple.** above, th
2020: 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20  e mapping might 
2030: 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34  go like this:  4
2040: 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c  ->3, 5->1, 8->2,
2050: 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35   29->0,.** 57->5
2060: 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65  , 73->4.  Or one
2070: 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f   of 719 other co
2080: 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74  mbinations might
2090: 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20   be used. It.** 
20a0: 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  does not really 
20b0: 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73  matter.  What is
20c0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
20d0: 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  at sparse cursor
20e0: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20  .** numbers all 
20f0: 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  get mapped into 
2100: 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74  bit numbers that
2110: 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e   begin with 0 an
2120: 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20  d contain.** no 
2130: 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  gaps..*/.struct 
2140: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20  WhereMaskSet {. 
2150: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69  * Number of assi
2180: 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75  gned cursor valu
2190: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42  es */.  int ix[B
21a0: 4d 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  MS];            
21b0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21c0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68  assigned to each
21d0: 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   bit */.};../*.*
21e0: 2a 20 41 20 57 68 65 72 65 43 6f 73 74 20 6f 62  * A WhereCost ob
21f0: 6a 65 63 74 20 72 65 63 6f 72 64 73 20 61 20 6c  ject records a l
2200: 6f 6f 6b 75 70 20 73 74 72 61 74 65 67 79 20 61  ookup strategy a
2210: 6e 64 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  nd the estimated
2220: 0a 2a 2a 20 63 6f 73 74 20 6f 66 20 70 75 72 73  .** cost of purs
2230: 75 69 6e 67 20 74 68 61 74 20 73 74 72 61 74 65  uing that strate
2240: 67 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  gy..*/.struct Wh
2250: 65 72 65 43 6f 73 74 20 7b 0a 20 20 57 68 65 72  ereCost {.  Wher
2260: 65 50 6c 61 6e 20 70 6c 61 6e 3b 20 20 20 20 2f  ePlan plan;    /
2270: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 73 74 72  * The lookup str
2280: 61 74 65 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c  ategy */.  doubl
2290: 65 20 72 43 6f 73 74 3b 20 20 20 20 20 20 2f 2a  e rCost;      /*
22a0: 20 4f 76 65 72 61 6c 6c 20 63 6f 73 74 20 6f 66   Overall cost of
22b0: 20 70 75 72 73 75 69 6e 67 20 74 68 69 73 20 73   pursuing this s
22c0: 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20 2a  earch strategy *
22d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64  /.  Bitmask used
22e0: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
22f0: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65  k of cursors use
2300: 64 20 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a  d by this plan *
2310: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d  /.};../*.** Bitm
2320: 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65  asks for the ope
2330: 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69  rators that indi
2340: 63 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ces are able to 
2350: 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20  exploit.  An.** 
2360: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  OR-ed combinatio
2370: 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65  n of these value
2380: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  s can be used wh
2390: 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  en searching for
23a0: 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65  .** terms in the
23b0: 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a   where clause..*
23c0: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20  /.#define WO_IN 
23d0: 20 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e      0x001.#defin
23e0: 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30  e WO_EQ     0x00
23f0: 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20  2.#define WO_LT 
2400: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
2410: 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LT-TK_EQ)).#defi
2420: 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f  ne WO_LE     (WO
2430: 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45  _EQ<<(TK_LE-TK_E
2440: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
2450: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
2460: 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GT-TK_EQ)).#de
2470: 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28  fine WO_GE     (
2480: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b  WO_EQ<<(TK_GE-TK
2490: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
24a0: 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64  _MATCH  0x040.#d
24b0: 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20  efine WO_ISNULL 
24c0: 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f  0x080.#define WO
24d0: 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20  _OR     0x100   
24e0: 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f      /* Two or mo
24f0: 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  re OR-connected 
2500: 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65  terms */.#define
2510: 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30   WO_AND    0x200
2520: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
2530: 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63   more AND-connec
2540: 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65  ted terms */.#de
2550: 66 69 6e 65 20 57 4f 5f 4e 4f 4f 50 20 20 20 30  fine WO_NOOP   0
2560: 78 38 30 30 20 20 20 20 20 20 20 2f 2a 20 54 68  x800       /* Th
2570: 69 73 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  is term does not
2580: 20 72 65 73 74 72 69 63 74 20 73 65 61 72 63 68   restrict search
2590: 20 73 70 61 63 65 20 2a 2f 0a 0a 23 64 65 66 69   space */..#defi
25a0: 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30 78 66  ne WO_ALL    0xf
25b0: 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  ff       /* Mask
25c0: 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62 6c 65   of all possible
25d0: 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a   WO_* values */.
25e0: 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e 47 4c  #define WO_SINGL
25f0: 45 20 30 78 30 66 66 20 20 20 20 20 20 20 2f 2a  E 0x0ff       /*
2600: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e 6f 6e   Mask of all non
2610: 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a 20 76  -compound WO_* v
2620: 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alues */../*.** 
2630: 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c 61 67  Value for wsFlag
2640: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65  s returned by be
2650: 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20 73 74  stIndex() and st
2660: 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65 72 65  ored in.** Where
2670: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e 20 20  Level.wsFlags.  
2680: 54 68 65 73 65 20 66 6c 61 67 73 20 64 65 74 65  These flags dete
2690: 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65 61 72  rmine which sear
26a0: 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69 65 73  ch.** strategies
26b0: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
26c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73  ..**.** The leas
26d0: 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 31 32  t significant 12
26e0: 20 62 69 74 73 20 69 73 20 72 65 73 65 72 76 65   bits is reserve
26f0: 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72 20  d as a mask for 
2700: 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76 65  WO_ values above
2710: 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c 65  ..** The WhereLe
2720: 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65 6c  vel.wsFlags fiel
2730: 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74  d is usually set
2740: 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   to WO_IN|WO_EQ|
2750: 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75  WO_ISNULL..** Bu
2760: 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  t if the table i
2770: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
2780: 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  e of a left join
2790: 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46  , WhereLevel.wsF
27a0: 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20 74  lags.** is set t
27b0: 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20  o WO_IN|WO_EQ.  
27c0: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 77  The WhereLevel.w
27d0: 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63 61 6e  sFlags field can
27e0: 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 61 73   then be used as
27f0: 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61 72  .** the "op" par
2800: 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54 65  ameter to findTe
2810: 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20 72  rm when we are r
2820: 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69 74  esolving equalit
2830: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  y constraints..*
2840: 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  * ISNULL constra
2850: 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20 6e  ints will then n
2860: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68  ot be used on th
2870: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2880: 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e   a left.** join.
2890: 20 20 54 69 63 6b 65 74 73 20 23 32 31 37 37 20    Tickets #2177 
28a0: 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23 64  and #2189..*/.#d
28b0: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
28c0: 44 5f 45 51 20 20 20 20 20 30 78 30 30 30 30 31  D_EQ     0x00001
28d0: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58  000  /* rowid=EX
28e0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
28f0: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
2900: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
2910: 45 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f  E  0x00002000  /
2920: 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64  * rowid<EXPR and
2930: 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a  /or rowid>EXPR *
2940: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2950: 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30  COLUMN_EQ    0x0
2960: 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d 45 58  0010000  /* x=EX
2970: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
2980: 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   or x IS NULL */
2990: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
29a0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
29b0: 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45 58 50  020000  /* x<EXP
29c0: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
29d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
29e0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
29f0: 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78 20 49  00040000  /* x I
2a00: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
2a10: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
2a20: 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30 30 30  NULL  0x00080000
2a30: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
2a40: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2a50: 49 4e 44 45 58 45 44 20 20 20 20 20 20 30 78 30  INDEXED      0x0
2a60: 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e 79 74  00f0000  /* Anyt
2a70: 68 69 6e 67 20 74 68 61 74 20 75 73 65 73 20 61  hing that uses a
2a80: 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65 66 69  n index */.#defi
2a90: 6e 65 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c  ne WHERE_NOT_FUL
2aa0: 4c 53 43 41 4e 20 30 78 31 30 30 66 33 30 30 30  LSCAN 0x100f3000
2ab0: 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 64 6f    /* Does not do
2ac0: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
2ad0: 61 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  an */.#define WH
2ae0: 45 52 45 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20  ERE_IN_ABLE     
2af0: 20 30 78 30 30 30 66 31 30 30 30 20 20 2f 2a 20   0x000f1000  /* 
2b00: 41 62 6c 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Able to support 
2b10: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  an IN operator *
2b20: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2b30: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
2b40: 30 31 30 30 30 30 30 20 20 2f 2a 20 78 3c 45 58  0100000  /* x<EX
2b50: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
2b60: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2b70: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
2b80: 4d 49 54 20 20 20 20 30 78 30 30 32 30 30 30 30  MIT    0x0020000
2b90: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
2ba0: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
2bb0: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
2bc0: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
2bd0: 20 30 78 30 30 33 30 30 30 30 30 20 20 2f 2a 20   0x00300000  /* 
2be0: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
2bf0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
2c00: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
2c10: 20 20 20 20 20 30 78 30 30 38 30 30 30 30 30 20       0x00800000 
2c20: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
2c30: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
2c40: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2c50: 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20 30 78  _ORDERBY      0x
2c60: 30 31 30 30 30 30 30 30 20 20 2f 2a 20 4f 75 74  01000000  /* Out
2c70: 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20  put will appear 
2c80: 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  in correct order
2c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2ca0: 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20 30  E_REVERSE      0
2cb0: 78 30 32 30 30 30 30 30 30 20 20 2f 2a 20 53 63  x02000000  /* Sc
2cc0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
2cd0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
2ce0: 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20  HERE_UNIQUE     
2cf0: 20 20 30 78 30 34 30 30 30 30 30 30 20 20 2f 2a    0x04000000  /*
2d00: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
2d10: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
2d20: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
2d30: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 30 38  IRTUALTABLE 0x08
2d40: 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 76  000000  /* Use v
2d50: 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f  irtual-table pro
2d60: 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64 65 66 69  cessing */.#defi
2d70: 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  ne WHERE_MULTI_O
2d80: 52 20 20 20 20 20 30 78 31 30 30 30 30 30 30 30  R     0x10000000
2d90: 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75    /* OR using mu
2da0: 6c 74 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a  ltiple indices *
2db0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
2dc0: 54 45 4d 50 5f 49 4e 44 45 58 20 20 20 30 78 32  TEMP_INDEX   0x2
2dd0: 30 30 30 30 30 30 30 20 20 2f 2a 20 55 73 65 73  0000000  /* Uses
2de0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2df0: 64 65 78 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  dex */.#define W
2e00: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 20 20 20  HERE_DISTINCT   
2e10: 20 20 30 78 34 30 30 30 30 30 30 30 20 20 2f 2a    0x40000000  /*
2e20: 20 43 6f 72 72 65 63 74 20 6f 72 64 65 72 20 66   Correct order f
2e30: 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 0a  or DISTINCT */..
2e40: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2e50: 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2e60: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2e70: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
2e80: 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73   void whereClaus
2e90: 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c  eInit(.  WhereCl
2ea0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
2eb0: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c    /* The WhereCl
2ec0: 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69  ause to be initi
2ed0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73  alized */.  Pars
2ee0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2f00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2f10: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
2f20: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
2f30: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
2f40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 74  cursor numbers t
2f50: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20  o bitmasks */.  
2f60: 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20  u16 wctrlFlags  
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68           /* Migh
2f80: 74 20 69 6e 63 6c 75 64 65 20 57 48 45 52 45 5f  t include WHERE_
2f90: 41 4e 44 5f 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  AND_ONLY */.){. 
2fa0: 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70   pWC->pParse = p
2fb0: 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d  Parse;.  pWC->pM
2fc0: 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65  askSet = pMaskSe
2fd0: 74 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72  t;.  pWC->pOuter
2fe0: 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65   = 0;.  pWC->nTe
2ff0: 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  rm = 0;.  pWC->n
3000: 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
3010: 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a  (pWC->aStatic);.
3020: 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e    pWC->a = pWC->
3030: 61 53 74 61 74 69 63 3b 0a 20 20 70 57 43 2d 3e  aStatic;.  pWC->
3040: 76 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 57 43  vmask = 0;.  pWC
3050: 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
3060: 63 74 72 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a  ctrlFlags;.}../*
3070: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3080: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3090: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
30a0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
30b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
30c0: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
30d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
30e0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
30f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
3100: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
3110: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
3120: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
3130: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
3140: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
3150: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3160: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3170: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
3180: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
3190: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
31a0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
31b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
31c0: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
31d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
31e0: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
31f0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
3200: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
3210: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
3230: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
3240: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
3250: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
3260: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
3270: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
3280: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
3290: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
32a0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
32b0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
32c0: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
32d0: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
32e0: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
32f0: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
3300: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3310: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pWC->pParse->d
3320: 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  b;.  for(i=pWC->
3330: 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e  nTerm-1, a=pWC->
3340: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b  a; i>=0; i--, a+
3350: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 77  +){.    if( a->w
3360: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  tFlags & TERM_DY
3370: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
3380: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3390: 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b 0a  (db, a->pExpr);.
33a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 2d      }.    if( a-
33b0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
33c0: 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20  ORINFO ){.      
33d0: 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74  whereOrInfoDelet
33e0: 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49 6e  e(db, a->u.pOrIn
33f0: 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fo);.    }else i
3400: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3410: 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b 0a  TERM_ANDINFO ){.
3420: 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49 6e        whereAndIn
3430: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
3440: 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20 20  u.pAndInfo);.   
3450: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43   }.  }.  if( pWC
3460: 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  ->a!=pWC->aStati
3470: 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
3480: 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d 3e  DbFree(db, pWC->
3490: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
34a0: 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e 65   Add a single ne
34b0: 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74 72  w WhereTerm entr
34c0: 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  y to the WhereCl
34d0: 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43 2e  ause object pWC.
34e0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65 72  .** The new Wher
34f0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20  eTerm object is 
3500: 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d  constructed from
3510: 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74 68   Expr p and with
3520: 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65   wtFlags..** The
3530: 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e 61   index in pWC->a
3540: 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57 68  [] of the new Wh
3550: 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75 72  ereTerm is retur
3560: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ned on success..
3570: 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  ** 0 is returned
3580: 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65 72   if the new Wher
3590: 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  eTerm could not 
35a0: 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f 20  be added due to 
35b0: 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  a memory.** allo
35c0: 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54  cation error.  T
35d0: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
35e0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69 6c  tion failure wil
35f0: 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e  l be recorded in
3600: 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  .** the db->mall
3610: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 6f  ocFailed flag so
3620: 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65 76   that higher-lev
3630: 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  el functions can
3640: 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a   detect it..**.*
3650: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3660: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
3670: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57 43   size of the pWC
3680: 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  ->a[] array as n
3690: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
36a0: 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20 61  If the wtFlags a
36b0: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
36c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
36d0: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
36e0: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
36f0: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
3700: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
3710: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
3720: 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20   object pWC..** 
3730: 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76 65  This is true eve
3740: 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  n if this routin
3750: 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63  e fails to alloc
3760: 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65 54  ate a new WhereT
3770: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  erm..**.** WARNI
3780: 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e  NG:  This routin
3790: 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61  e might realloca
37a0: 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65  te the space use
37b0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68  d to store.** Wh
37c0: 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70  ereTerms.  All p
37d0: 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65  ointers to Where
37e0: 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20  Terms should be 
37f0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74 65  invalidated afte
3800: 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69  r.** calling thi
3810: 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63 68  s routine.  Such
3820: 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62 65   pointers may be
3830: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 62   reinitialized b
3840: 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  y referencing.**
3850: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
3860: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
3870: 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  nt whereClauseIn
3880: 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73 65  sert(WhereClause
3890: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c 20   *pWC, Expr *p, 
38a0: 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57  u8 wtFlags){.  W
38b0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
38c0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65  .  int idx;.  te
38d0: 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73 20  stcase( wtFlags 
38e0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
38f0: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 30 30 32 31  ;  /* EV: R-0021
3900: 31 2d 31 35 31 30 30 20 2a 2f 0a 20 20 69 66 28  1-15100 */.  if(
3910: 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43   pWC->nTerm>=pWC
3920: 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57  ->nSlot ){.    W
3930: 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d  hereTerm *pOld =
3940: 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c   pWC->a;.    sql
3950: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
3960: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
3970: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
3980: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
3990: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
39a0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
39b0: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
39c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
39d0: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
39e0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
39f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3a00: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
3a10: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
3a20: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
3a30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3a40: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
3a50: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
3a60: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
3a70: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
3a80: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
3a90: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
3aa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
3ab0: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
3ac0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
3ad0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
3ae0: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
3af0: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
3b00: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
3b10: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
3b20: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
3b30: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20  m->pExpr = p;.  
3b40: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 3d  pTerm->wtFlags =
3b50: 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 54 65 72   wtFlags;.  pTer
3b60: 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a 20 20  m->pWC = pWC;.  
3b70: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
3b80: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 64   -1;.  return id
3b90: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
3ba0: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66   routine identif
3bb0: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f  ies subexpressio
3bc0: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
3bd0: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20  clause where.** 
3be0: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69  each subexpressi
3bf0: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
3c00: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
3c10: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  tor or some othe
3c20: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70  r.** operator sp
3c30: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f  ecified in the o
3c40: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68  p parameter.  Th
3c50: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
3c60: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69  ructure.** is fi
3c70: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65  lled with pointe
3c80: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73  rs to subexpress
3c90: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  ions.  For examp
3ca0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45  le:.**.**    WHE
3cb0: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41  RE  a=='hello' A
3cc0: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31  ND coalesce(b,11
3cd0: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d  )<10 AND (c+12!=
3ce0: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20  d OR c==22).**  
3cf0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
3d00: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
3d10: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
3d20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
3d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73  .**            s
3d40: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20  lot[0]          
3d50: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20    slot[1]       
3d60: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a          slot[2].
3d70: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
3d80: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
3d90: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c  in pExpr is unal
3da0: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73  tered.  All this
3db0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
3dc0: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20   is make slot[] 
3dd0: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f  entries point to
3de0: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69   substructure wi
3df0: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a  thin pExpr..**.*
3e00: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75  * In the previou
3e10: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69  s sentence and i
3e20: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22  n the diagram, "
3e30: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74  slot[]" refers t
3e40: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c  o.** the WhereCl
3e50: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20  ause.a[] array. 
3e60: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61   The slot[] arra
3e70: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
3e80: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
3e90: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
3ea0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
3eb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
3ec0: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
3ed0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
3ee0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
3ef0: 0a 20 20 70 57 43 2d 3e 6f 70 20 3d 20 28 75 38  .  pWC->op = (u8
3f00: 29 6f 70 3b 0a 20 20 69 66 28 20 70 45 78 70 72  )op;.  if( pExpr
3f10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3f20: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
3f30: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
3f40: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
3f50: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
3f60: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
3f70: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
3f80: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
3f90: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
3fa0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
3fb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3fc0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
3fd0: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
3fe0: 74 20 28 61 20 57 68 65 72 65 4d 61 73 6b 53 65  t (a WhereMaskSe
3ff0: 74 20 6f 62 6a 65 63 74 29 0a 2a 2f 0a 23 64 65  t object).*/.#de
4000: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
4010: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
4020: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
4030: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4040: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
4050: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
4060: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
4070: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
4080: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
4090: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
40a0: 6b 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d  k getMask(WhereM
40b0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
40c0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
40d0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
40e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d  t( pMaskSet->n<=
40f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d  (int)sizeof(Bitm
4100: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28  ask)*8 );.  for(
4110: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
4120: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
4130: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
4140: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
4150: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
4160: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
4170: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
4180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
4190: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
41a0: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
41b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
41c0: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
41d0: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
41e0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
41f0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
4200: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
4210: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
4220: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
4230: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
4240: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
4250: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
4260: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
4270: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
4280: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
4290: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
42a0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
42b0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
42c0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
42d0: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
42e0: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
42f0: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
4300: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
4310: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
4320: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
4330: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
4340: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
4350: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
4360: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
4370: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
4380: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
4390: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
43a0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
43b0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
43c0: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
43d0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
43e0: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
43f0: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
4400: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
4410: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
4420: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 52  invoked sqlite3R
4430: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4440: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
4450: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
4460: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
4470: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
4480: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
4490: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
44a0: 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  he sqlite3Resolv
44b0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f 75  eExprNames() rou
44c0: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
44d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
44e0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
44f0: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
4500: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
4510: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
4520: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
4530: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
4540: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
4550: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
4560: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
4570: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
4580: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
4590: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
45a0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
45b0: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
45c0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
45d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
45e0: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
45f0: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
4600: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
4610: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
4620: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
4630: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
4640: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
4650: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4660: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4670: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
4680: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
4690: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
46a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
46b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
46c0: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
46d0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
46e0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
46f0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
4700: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
4710: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4720: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
4730: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4740: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4750: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
4760: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4770: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4780: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
4790: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
47a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
47b0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
47c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
47d0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
47e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
47f0: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
4800: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
4810: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
4820: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
4830: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
4840: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
4850: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4860: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
4870: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
4880: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
4890: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
48a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
48b0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
48c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
48d0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
48e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
48f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4900: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4910: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
4920: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4930: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
4940: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
4950: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4960: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
4970: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
4980: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
4990: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
49a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
49b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
49c0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
49d0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
49e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
49f0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
4a00: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
4a10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4a20: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
4a30: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
4a40: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4a50: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
4a60: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
4a70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
4a80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
4a90: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
4aa0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
4ab0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
4ac0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4ad0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
4ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
4af0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
4b00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4b10: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
4b20: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
4b30: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4b40: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4b50: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
4b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4b70: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
4b80: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
4b90: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
4ba0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4bb0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
4bc0: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
4bd0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
4be0: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
4bf0: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
4c00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4c10: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
4c20: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
4c30: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
4c40: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22  <=", ">=", and "
4c50: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45  IN"..**.** IMPLE
4c60: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
4c70: 35 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62  59926-26393 To b
4c80: 65 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69  e usable by an i
4c90: 6e 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74  ndex a term must
4ca0: 20 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66   be.** of one of
4cb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
4cc0: 6f 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65  orms: column = e
4cd0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4ce0: 20 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   > expression.**
4cf0: 20 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65   column >= expre
4d00: 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65  ssion column < e
4d10: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e  xpression column
4d20: 20 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   <= expression.*
4d30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63  * expression = c
4d40: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d50: 20 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73   > column expres
4d60: 73 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a  sion >= column.*
4d70: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63  * expression < c
4d80: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
4d90: 20 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d   <= column colum
4da0: 6e 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73  n IN.** (express
4db0: 69 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e  ion-list) column
4dc0: 20 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63   IN (subquery) c
4dd0: 6f 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f  olumn IS NULL.*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
4df0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
4e00: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
4e10: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
4e20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e30: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
4e40: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
4e50: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
4e60: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
4e70: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
4e80: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
4e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
4ea0: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
4eb0: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
4ec0: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
4ed0: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
4ee0: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
4ef0: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
4f00: 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45  define SWAP(TYPE
4f10: 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b  ,A,B) {TYPE t=A;
4f20: 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a   A=B; B=t;}../*.
4f30: 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d  ** Commute a com
4f40: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4f50: 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  .  Expressions o
4f60: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70  f the form "X op
4f70: 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65   Y".** are conve
4f80: 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20  rted into "Y op 
4f90: 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  X"..**.** If a c
4fa0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4fb0: 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  e is associated 
4fc0: 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20  with either the 
4fd0: 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a  left or right.**
4fe0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
4ff0: 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61  parison, it rema
5000: 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ins associated w
5010: 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64  ith the same sid
5020: 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63  e after.** the c
5030: 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22  ommutation. So "
5040: 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  Y collate NOCASE
5050: 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a   op X" becomes .
5060: 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f  ** "X collate NO
5070: 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73  CASE op Y". This
5080: 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20   is because any 
5090: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
50a0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66  ce on.** the lef
50b0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t hand side of a
50c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72   comparison over
50d0: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74  rides any collat
50e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a  ion sequence .**
50f0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
5100: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20   right. For the 
5110: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20  same reason the 
5120: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c  EP_ExpCollate fl
5130: 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  ag.** is not com
5140: 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  muted..*/.static
5150: 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74   void exprCommut
5160: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5170: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
5180: 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20   u16 expRight = 
5190: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
51a0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
51b0: 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78  llate);.  u16 ex
51c0: 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e  pLeft = (pExpr->
51d0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
51e0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  P_ExpCollate);. 
51f0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
5200: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
5210: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
5220: 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  N );.  pExpr->pR
5230: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  ight->pColl = sq
5240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5250: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5260: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
5270: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d  ->pLeft->pColl =
5280: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5290: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
52a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41  r->pLeft);.  SWA
52b0: 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72  P(CollSeq*,pExpr
52c0: 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c  ->pRight->pColl,
52d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
52e0: 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  oll);.  pExpr->p
52f0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28  Right->flags = (
5300: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
5310: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
5320: 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74  llate) | expLeft
5330: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
5340: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72  ->flags = (pExpr
5350: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
5360: 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29   ~EP_ExpCollate)
5370: 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53   | expRight;.  S
5380: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d  WAP(Expr*,pExpr-
5390: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70  >pRight,pExpr->p
53a0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
53b0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
53c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
53d0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20  LT==TK_GT+2 );. 
53e0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
53f0: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20  ==TK_LE+2 );.   
5400: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
5410: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65  K_EQ );.    asse
5420: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
5430: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5440: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
5450: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b  && pExpr->op<=TK
5460: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  _GE );.    pExpr
5470: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e  ->op = ((pExpr->
5480: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f  op-TK_GT)^2)+TK_
5490: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  GT;.  }.}../*.**
54a0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20   Translate from 
54b0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74  TK_xx operator t
54c0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e  o WO_xx bitmask.
54d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f  .*/.static u16 o
54e0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20  peratorMask(int 
54f0: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20  op){.  u16 c;.  
5500: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
5510: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f  p(op) );.  if( o
5520: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5530: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c  c = WO_IN;.  }el
5540: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
5550: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20  NULL ){.    c = 
5560: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  WO_ISNULL;.  }el
5570: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
5580: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
5590: 51 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a  Q)) < 0x7fff );.
55a0: 20 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f      c = (u16)(WO
55b0: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
55c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
55d0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
55e0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
55f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
5600: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
5610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5620: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
5630: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
5640: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
5650: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
5660: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
5670: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
5680: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
5690: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
56a0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
56b0: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
56c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
56d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
56e0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
56f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5700: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
5710: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
5720: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
5730: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
5740: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
5750: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
5760: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
5770: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
5780: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
5790: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
57a0: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
57b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
57c0: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
57d0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
57e0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
57f0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
5800: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5810: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
5820: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
5830: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
5840: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
5850: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
5860: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
5870: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
5880: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
5890: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
58a0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
58b0: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
58c0: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
58d0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
58e0: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5900: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
5910: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
5920: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
5930: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
5940: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
5950: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
5960: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
5970: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
5980: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
5990: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
59a0: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
59b0: 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20   op &= WO_ALL;. 
59c0: 20 66 6f 72 28 3b 20 70 57 43 3b 20 70 57 43 3d   for(; pWC; pWC=
59d0: 70 57 43 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  pWC->pOuter){.  
59e0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
59f0: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
5a00: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
5a10: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
5a20: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5a30: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 26  =iCur.         &
5a40: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
5a50: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
5a60: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
5a70: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
5a80: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
5a90: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
5aa0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70  ->eOperator & op
5ab0: 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
5ac0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
5ad0: 6e 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20  n>=0 && pIdx && 
5ae0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
5af0: 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  !=WO_ISNULL ){. 
5b00: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
5b10: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
5b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
5b30: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
5b40: 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
5b50: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  f;.          int
5b60: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 50 61   j;.          Pa
5b70: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
5b80: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 0a 20 20  C->pParse;.  .  
5b90: 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d          idxaff =
5ba0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
5bb0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
5bc0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
5bd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
5be0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
5bf0: 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69   idxaff) ) conti
5c00: 6e 75 65 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  nue;.  .        
5c10: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5c20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
5c30: 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20  quence required 
5c40: 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f  from an index fo
5c50: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  r.          ** i
5c60: 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66  t to be useful f
5c70: 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78  or optimising ex
5c80: 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f  pression pX. Sto
5c90: 72 65 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  re this.        
5ca0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
5cb0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
5cc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5cd0: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
5ce0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
5cf0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
5d00: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
5d10: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
5d20: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
5d30: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
5d40: 61 73 73 65 72 74 28 70 43 6f 6c 6c 20 7c 7c 20  assert(pColl || 
5d50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 3b 0a 20  pParse->nErr);. 
5d60: 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28   .          for(
5d70: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
5d80: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
5d90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5da0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d     if( NEVER(j>=
5db0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  pIdx->nColumn) )
5dc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5de0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71   if( pColl && sq
5df0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
5e00: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
5e10: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
5e20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5e30: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
5e40: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
5e50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
5e70: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5e80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
5e90: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
5ea0: 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c  *, WhereClause*,
5eb0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   int);../*.** Ca
5ec0: 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f  ll exprAnalyze o
5ed0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61  n all terms in a
5ee0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
5ef0: 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .**.**.*/.static
5f00: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
5f10: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
5f20: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
5f30: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
5f40: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
5f50: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
5f60: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
5f70: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
5f80: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
5f90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
5fa0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
5fb0: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
5fc0: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
5fd0: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
5fe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5ff0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
6000: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
6010: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6020: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
6030: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
6040: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
6050: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
6060: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
6070: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
6080: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
6090: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
60a0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
60b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
60c0: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
60d0: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
60e0: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
60f0: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
6100: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
6110: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
6120: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
6130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
6140: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72  ikeOrGlob(.  Par
6150: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
6160: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
6170: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
6180: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
6190: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
61a0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
61b0: 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  sion */.  Expr *
61c0: 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50  *ppPrefix,  /* P
61d0: 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52  ointer to TK_STR
61e0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ING expression w
61f0: 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66  ith pattern pref
6200: 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73  ix */.  int *pis
6210: 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75  Complete, /* Tru
6220: 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69  e if the only wi
6230: 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74  ldcard is % in t
6240: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
6250: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43  r */.  int *pnoC
6260: 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ase      /* True
6270: 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73   if uppercase is
6280: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
6290: 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20  owercase */.){. 
62a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
62b0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53   0;         /* S
62c0: 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20  tring on RHS of 
62d0: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
62e0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
62f0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a   *pLeft;      /*
6300: 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   Right and left 
6310: 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65  size of LIKE ope
6320: 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c  rator */.  ExprL
6330: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  ist *pList;     
6340: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6350: 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65   operands to the
6360: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
6370: 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20  /.  int c;      
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6390: 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20  * One character 
63a0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  in z[] */.  int 
63b0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
63c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
63d0: 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64   of non-wildcard
63e0: 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65   prefix characte
63f0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b  rs */.  char wc[
6400: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
6410: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63     /* Wildcard c
6420: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73  haracters */.  s
6430: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6440: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
6450: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6460: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
6470: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
6480: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
6490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
64a0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
64b0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
64c0: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
64d0: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
64e0: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
64f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
6500: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
6510: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
6520: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
6530: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
6540: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6550: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
6560: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
6570: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
6580: 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71  COLUMN .   || sq
6590: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
65a0: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
65b0: 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c  _AFF_TEXT .   ||
65c0: 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74   IsVirtual(pLeft
65d0: 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20  ->pTab).  ){.   
65e0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
65f0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
6600: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
6610: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
6620: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
6630: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
6640: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
6650: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
6660: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
6670: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
6680: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
6690: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
66a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
66b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
66c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
66d0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
66e0: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
66f0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
6700: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
6710: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
6720: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
6730: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
6740: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
6750: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
6760: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
6770: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
6780: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
6790: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
67a0: 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65 70  dbeGetValue(pRep
67b0: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
67c0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
67d0: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
67e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
67f0: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
6800: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
6810: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
6820: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
6830: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
6840: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
6850: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
6860: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
6870: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
6880: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
6890: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
68a0: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
68b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
68c0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
68d0: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
68e0: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
68f0: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
6900: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
6910: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
6920: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
6930: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
6940: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
6950: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
6960: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
6970: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
6980: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
6990: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
69a0: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
69b0: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
69c0: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
69d0: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
69e0: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
69f0: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
6a00: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
6a10: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
6a20: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
6a30: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
6a40: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
6a50: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
6a60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
6a70: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
6a80: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
6a90: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
6aa0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
6ab0: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
6ac0: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
6ad0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
6ae0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
6af0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
6b00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
6b10: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
6b20: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
6b30: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
6b40: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
6b50: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
6b60: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
6b70: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
6b80: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
6b90: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
6ba0: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
6bb0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
6bc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
6bd0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
6be0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
6bf0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
6c00: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
6c10: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
6c20: 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64  around them, add
6c30: 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69   a dummy OP_Vari
6c40: 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  able here..     
6c50: 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20       */ .       
6c60: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6c70: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6c80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
6c90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6ca0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
6cb0: 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20  Right, r1);.    
6cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6cd0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c  eChangeP3(v, sql
6ce0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6cf0: 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20  ddr(v)-1, 0);.  
6d00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6d10: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6d20: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
6d50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
6d60: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
6d70: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75  ee(pVal);.  retu
6d80: 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e  rn (z!=0);.}.#en
6d90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6da0: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
6db0: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
6dc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6dd0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
6de0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6df0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
6e00: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
6e10: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
6e20: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
6e30: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
6e40: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
6e50: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
6e60: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
6e70: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
6e80: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
6e90: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
6ea0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
6eb0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
6ec0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
6ed0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
6ee0: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
6ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6f00: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
6f10: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
6f20: 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29  .zToken,"match")
6f30: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6f40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
6f50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
6f60: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
6f70: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
6f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6f90: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
6fa0: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
6fb0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
6fc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
6fd0: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
6fe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6ff0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
7000: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
7010: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
7020: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
7030: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
7040: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
7050: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
7060: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7070: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
7080: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
70a0: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
70b0: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
70c0: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
70d0: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
70e0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
70f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
7100: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
7110: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
7120: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
7130: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
7140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
7150: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
7160: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
7170: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7180: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
7190: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
71a0: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
71b0: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
71c0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
71d0: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
71e0: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
71f0: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
7200: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
7210: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
7240: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
7250: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
7260: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
7270: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
7280: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
7290: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
72a0: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
72b0: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
72c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
72d0: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
72e0: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
72f0: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
7300: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
7310: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
7320: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
7330: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
7340: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
7350: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
7360: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
7370: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
7380: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
7390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
73a0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
73b0: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
73c0: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
73d0: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
73e0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
73f0: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
7400: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
7410: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
7420: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
7430: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
7440: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
7450: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
7460: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
7470: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
7480: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
7490: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
74a0: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
74b0: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
74c0: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
74d0: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
74e0: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
74f0: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
7500: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
7510: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
7520: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
7530: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
7540: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
7550: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
7560: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
7570: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
7580: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
7590: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
75a0: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
75b0: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
75c0: 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61  column of C.** a
75d0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20   single table T 
75e0: 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61  (as shown in exa
75f0: 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68  mple B above) th
7600: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7610: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20  virtual.** term 
7620: 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76  that is an equiv
7630: 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73  alent IN express
7640: 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
7650: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
7660: 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79  m.** being analy
7670: 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  zed is:.**.**   
7680: 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52     x = expr1  OR
7690: 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20    expr2 = x  OR 
76a0: 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a   x = expr3.**.**
76b0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
76c0: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  ew virtual term 
76d0: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
76e0: 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72        x IN (expr
76f0: 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a  1,expr2,expr3).*
7700: 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a  *.** CASE 2:.**.
7710: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7720: 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  ms are indexable
7730: 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62   by a single tab
7740: 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a  le T, then set.*
7750: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7760: 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20  rm.eOperator    
7770: 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f            =  WO_
7780: 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  OR.**     WhereT
7790: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  erm.u.pOrInfo->i
77a0: 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68  ndexable  |=  th
77b0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
77c0: 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a  for table T.**.*
77d0: 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22  * A subterm is "
77e0: 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74  indexable" if it
77f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
7800: 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78  ** "T.C <op> <ex
7810: 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20  pr>" where C is 
7820: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  any column of ta
7830: 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f  ble T and .** <o
7840: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22  p> is one of "="
7850: 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22  , "<", "<=", ">"
7860: 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c  , ">=", "IS NULL
7870: 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41  ", or "IN"..** A
7880: 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f   subterm is also
7890: 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74   indexable if it
78a0: 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77   is an AND of tw
78b0: 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62  o or more.** sub
78c0: 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73  subterms at leas
78d0: 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69  t one of which i
78e0: 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e  s indexable.  In
78f0: 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20  dexable AND .** 
7900: 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68  subterms have th
7910: 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65  eir eOperator se
7920: 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20  t to WO_AND and 
7930: 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70  they have.** u.p
7940: 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61  AndInfo set to a
7950: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
7960: 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54  ocated WhereAndT
7970: 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  erm object..**.*
7980: 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70  * From another p
7990: 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69  oint of view, "i
79a0: 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20  ndexable" means 
79b0: 74 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d  that the subterm
79c0: 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74   could.** potent
79d0: 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69  ially be used wi
79e0: 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61  th an index if a
79f0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  n appropriate in
7a00: 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54  dex exists..** T
7a10: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65  his analysis doe
7a20: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77  s not consider w
7a30: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7a40: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20  e index exists; 
7a50: 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74  that.** is somet
7a60: 68 69 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64  hing the bestInd
7a70: 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ex() routine wil
7a80: 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68  l determine.  Th
7a90: 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f  is analysis.** o
7aa0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65  nly looks at whe
7ab0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 20 61 70  ther subterms ap
7ac0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7ad0: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
7ae0: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
7af0: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
7b00: 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63  ve all satisfy c
7b10: 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20 61  ase 2.  But if a
7b20: 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74   term.** also st
7b30: 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31 20  atisfies case 1 
7b40: 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20 6b  (such as B) we k
7b50: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70 74  now that the opt
7b60: 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61  imizer will.** a
7b70: 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61 73  lways prefer cas
7b80: 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20  e 1, so in that 
7b90: 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64 20  case we pretend 
7ba0: 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20 6e  that case 2 is n
7bb0: 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e  ot.** satisfied.
7bc0: 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  .**.** It might 
7bd0: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
7be0: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73   multiple tables
7bf0: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20   are indexable. 
7c00: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
7c10: 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e   (E) above is in
7c20: 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65  dexable on table
7c30: 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a  s P, Q, and R..*
7c40: 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20  *.** Terms that 
7c50: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20 61  satisfy case 2 a
7c60: 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
7c70: 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e  r lookup by usin
7c80: 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e  g.** separate in
7c90: 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f  dices to find ro
7ca0: 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73 75  wids for each su
7cb0: 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73  bterm and compos
7cc0: 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e  ing.** the union
7cd0: 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75   of all rowids u
7ce0: 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62  sing a RowSet ob
7cf0: 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20 73  ject.  This is s
7d00: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69  imilar.** to "bi
7d10: 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e  tmap indices" in
7d20: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
7d30: 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  engines..**.** O
7d40: 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20  THERWISE:.**.** 
7d50: 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65 20  If neither case 
7d60: 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70  1 nor case 2 app
7d70: 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74  ly, then leave t
7d80: 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  he eOperator set
7d90: 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68   to.** zero.  Th
7da0: 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75  is term is not u
7db0: 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68  seful for search
7dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7dd0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
7de0: 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
7df0: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
7e00: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
7e10: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
7e20: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
7e30: 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74    /* the complet
7e40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
7e50: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e70: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52   Index of the OR
7e80: 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c  -term to be anal
7e90: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  yzed */.){.  Par
7ea0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
7eb0: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
7ec0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
7ed0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
7ee0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7ef0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7f00: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7f10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7f20: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
7f30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7f40: 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  rm];    /* The t
7f50: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
7f60: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ed */.  Expr *pE
7f70: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
7f80: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
7f90: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7fa0: 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f  n of the term */
7fb0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
7fc0: 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d  *pMaskSet = pWC-
7fd0: 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61  >pMaskSet; /* Ta
7fe0: 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f  ble use masks */
7ff0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8020: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
8030: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
8040: 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72  rWc;       /* Br
8050: 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69  eakup of pTerm i
8060: 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
8070: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72    WhereTerm *pOr
8080: 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41  Term;       /* A
8090: 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e   Sub-term within
80a0: 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20   the pOrWc */.  
80b0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72  WhereOrInfo *pOr
80c0: 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64  Info;     /* Add
80d0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
80e0: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
80f0: 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42  ith pTerm */.  B
8100: 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b  itmask chngToIN;
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
8120: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61  es that might sa
8130: 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a  tisfy case 1 */.
8140: 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61    Bitmask indexa
8150: 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ble;        /* T
8160: 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 69  ables that are i
8170: 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66  ndexable, satisf
8180: 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a  ying case 2 */..
8190: 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20    /*.  ** Break 
81a0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e  the OR clause in
81b0: 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65 20  to its separate 
81c0: 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73  subterms.  The s
81d0: 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a  ubterms are.  **
81e0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65   stored in a Whe
81f0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
8200: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69  re containing wi
8210: 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72  thin the WhereOr
8220: 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Info.  ** object
8230: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
8240: 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  d to the origina
8250: 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d  l OR clause term
8260: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8270: 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
8280: 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43   & (TERM_DYNAMIC
8290: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52  |TERM_ORINFO|TER
82a0: 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29  M_ANDINFO))==0 )
82b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
82c0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
82d0: 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e    pTerm->u.pOrIn
82e0: 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73  fo = pOrInfo = s
82f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8300: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
8310: 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20  OrInfo));.  if( 
8320: 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  pOrInfo==0 ) ret
8330: 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  urn;.  pTerm->wt
8340: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
8350: 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20  INFO;.  pOrWc = 
8360: 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  &pOrInfo->wc;.  
8370: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
8380: 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72  pOrWc, pWC->pPar
8390: 73 65 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57  se, pMaskSet, pW
83a0: 43 2d 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a  C->wctrlFlags);.
83b0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f 72    whereSplit(pOr
83c0: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Wc, pExpr, TK_OR
83d0: 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  );.  exprAnalyze
83e0: 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63 29  All(pSrc, pOrWc)
83f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
8400: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
8410: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  n;.  assert( pOr
8420: 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a  Wc->nTerm>=2 );.
8430: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75  .  /*.  ** Compu
8440: 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  te the set of ta
8450: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
8460: 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31 20  satisfy cases 1 
8470: 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64  or 2..  */.  ind
8480: 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61  exable = ~(Bitma
8490: 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e  sk)0;.  chngToIN
84a0: 20 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29   = ~(pWC->vmask)
84b0: 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d  ;.  for(i=pOrWc-
84c0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
84d0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
84e0: 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69   && indexable; i
84f0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
8500: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
8510: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
8520: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20  _SINGLE)==0 ){. 
8530: 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66       WhereAndInf
8540: 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20  o *pAndInfo;.   
8550: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
8560: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30  rm->eOperator==0
8570: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8580: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  ( (pOrTerm->wtFl
8590: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49  ags & (TERM_ANDI
85a0: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  NFO|TERM_ORINFO)
85b0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68  )==0 );.      ch
85c0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20  ngToIN = 0;.    
85d0: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c    pAndInfo = sql
85e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
85f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64  db, sizeof(*pAnd
8600: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
8610: 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20  ( pAndInfo ){.  
8620: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
8630: 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20  e *pAndWC;.     
8640: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
8650: 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  ndTerm;.        
8660: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42  int j;.        B
8670: 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20  itmask b = 0;.  
8680: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75        pOrTerm->u
8690: 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64  .pAndInfo = pAnd
86a0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f  Info;.        pO
86b0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  rTerm->wtFlags |
86c0: 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a  = TERM_ANDINFO;.
86d0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
86e0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
86f0: 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  AND;.        pAn
8700: 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d  dWC = &pAndInfo-
8710: 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65  >wc;.        whe
8720: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e  reClauseInit(pAn
8730: 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  dWC, pWC->pParse
8740: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2d  , pMaskSet, pWC-
8750: 3e 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20  >wctrlFlags);.  
8760: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
8770: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
8780: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
8790: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
87a0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
87b0: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
87c0: 70 41 6e 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d  pAndWC->pOuter =
87d0: 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 74 65   pWC;.        te
87e0: 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c  stcase( db->mall
87f0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8800: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8810: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8820: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8830: 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d  pAndTerm=pAndWC-
8840: 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54  >a; j<pAndWC->nT
8850: 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65  erm; j++, pAndTe
8860: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
8870: 20 20 20 61 73 73 65 72 74 28 20 70 41 6e 64 54     assert( pAndT
8880: 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
8890: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 6c            if( al
88a0: 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d  lowedOp(pAndTerm
88b0: 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a  ->pExpr->op) ){.
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 20                b 
88d0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
88e0: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
88f0: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8920: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
8930: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
8940: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
8950: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8960: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
8970: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
8980: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
8990: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
89a0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
89b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
89c0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
89d0: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
89e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
89f0: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
8a00: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d    b = getMask(pM
8a10: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
8a20: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8a30: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
8a40: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
8a50: 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20  VIRTUAL ){.     
8a60: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
8a70: 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61  ther = &pOrWc->a
8a80: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
8a90: 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d  t];.        b |=
8aa0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
8ab0: 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43  t, pOther->leftC
8ac0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
8ad0: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
8ae0: 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  &= b;.      if( 
8af0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8b00: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
8b10: 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20       chngToIN = 
8b20: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
8b30: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e          chngToIN
8b40: 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20   &= b;.      }. 
8b50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
8b60: 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73   ** Record the s
8b70: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8b80: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
8b90: 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67 68 74  .  The set might
8ba0: 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a   be.  ** empty..
8bb0: 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e    */.  pOrInfo->
8bc0: 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65  indexable = inde
8bd0: 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e  xable;.  pTerm->
8be0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65  eOperator = inde
8bf0: 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57  xable==0 ? 0 : W
8c00: 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  O_OR;..  /*.  **
8c10: 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20   chngToIN holds 
8c20: 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  a set of tables 
8c30: 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74  that *might* sat
8c40: 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 42 75  isfy case 1.  Bu
8c50: 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  t.  ** we have t
8c60: 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69  o do some additi
8c70: 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f  onal checking to
8c80: 20 73 65 65 20 69 66 20 63 61 73 65 20 31 20 72   see if case 1 r
8c90: 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61  eally.  ** is sa
8ca0: 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20  tisfied..  **.  
8cb0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c  ** chngToIN will
8cc0: 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20   hold either 0, 
8cd0: 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54  1, or 2 bits.  T
8ce0: 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65  he 0-bit case me
8cf0: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ans.  ** that th
8d00: 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62  ere is no possib
8d10: 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f  ility of transfo
8d20: 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61  rming the OR cla
8d30: 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a  use into an.  **
8d40: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63   IN operator bec
8d50: 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ause one or more
8d60: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
8d70: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a   clause contain.
8d80: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
8d90: 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20  ther than == on 
8da0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
8db0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
8dc0: 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61  he 1-bit.  ** ca
8dd0: 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76  se means that ev
8de0: 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
8df0: 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  OR clause is of 
8e00: 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74  the form.  ** "t
8e10: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72  able.column=expr
8e20: 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  " for some singl
8e30: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e  e table.  The on
8e40: 65 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  e bit that is se
8e50: 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72  t.  ** will corr
8e60: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f  espond to the co
8e70: 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20  mmon table.  We 
8e80: 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68  still need to ch
8e90: 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eck to make.  **
8ea0: 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 63   sure the same c
8eb0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e  olumn is used on
8ec0: 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65   all terms.  The
8ed0: 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 20 77   2-bit case is w
8ee0: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  hen.  ** the all
8ef0: 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68   terms are of th
8f00: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63  e form "table1.c
8f10: 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c  olumn=table2.col
8f20: 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d  umn".  It.  ** m
8f30: 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65  ight be possible
8f40: 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f   to form an IN o
8f50: 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 69 74  perator with eit
8f60: 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  her table1.colum
8f70: 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32  n.  ** or table2
8f80: 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c  .column as the L
8f90: 48 53 20 69 66 20 65 69 74 68 65 72 20 69 73 20  HS if either is 
8fa0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20  common to every 
8fb0: 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65  term of.  ** the
8fc0: 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   OR clause..  **
8fd0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
8fe0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
8ff0: 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31  m "table.column1
9000: 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20  =table.column2" 
9010: 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74  (the.  ** same t
9020: 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a  able on both siz
9030: 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61  es of the ==) ca
9040: 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65  nnot be optimize
9050: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  d..  */.  if( ch
9060: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e  ngToIN ){.    in
9070: 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d  t okToChngToIN =
9080: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
9090: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
90a0: 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64  n to IN is valid
90b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
90c0: 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  umn = -1;       
90d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65    /* Column inde
90e0: 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f  x on lhs of IN o
90f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  perator */.    i
9100: 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  nt iCursor = -1;
9110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9120: 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20  e cursor common 
9130: 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a  to all terms */.
9140: 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20      int j = 0;  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9160: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
9170: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
9180: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
9190: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65  column that appe
91a0: 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20  ars on one side 
91b0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  or the.    ** ot
91c0: 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70  her of the == op
91d0: 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20  erator in every 
91e0: 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74  subterm.  That t
91f0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a  able and column.
9200: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
9210: 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73  ecorded in iCurs
9220: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20  or and iColumn. 
9230: 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74   There might not
9240: 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73   be any.    ** s
9250: 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  uch table and co
9260: 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43  lumn.  Set okToC
9270: 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70  hngToIN if an ap
9280: 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a  propriate table.
9290: 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d      ** and colum
92a0: 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c  n is found but l
92b0: 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49  eave okToChngToI
92c0: 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66  N false if not f
92d0: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ound..    */.   
92e0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26   for(j=0; j<2 &&
92f0: 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20   !okToChngToIN; 
9300: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54  j++){.      pOrT
9310: 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a  erm = pOrWc->a;.
9320: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
9330: 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  c->nTerm-1; i>=0
9340: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
9350: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9360: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
9370: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
9380: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
9390: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52  >wtFlags &= ~TER
93a0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
93b0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
93c0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
93d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
93e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d  * This is the 2-
93f0: 62 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20  bit case and we 
9400: 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  are on the secon
9410: 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a  d iteration and.
9420: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72            ** cur
9430: 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f  rent term is fro
9440: 6d 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  m the first iter
9450: 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20  ation.  So skip 
9460: 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  this term. */.  
9470: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9480: 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  j==1 );.        
9490: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
94a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
94b0: 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65  ( (chngToIN & ge
94c0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
94d0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
94e0: 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sor))==0 ){.    
94f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65        /* This te
9500: 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68  rm must be of th
9510: 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e  e form t1.a==t2.
9520: 62 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e  b where t2 is in
9530: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
9540: 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62  * chngToIN set b
9550: 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54  ut t1 is not.  T
9560: 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  his term will be
9570: 20 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65   either preceede
9580: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
9590: 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20  r follwed by an 
95a0: 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74  inverted copy (t
95b0: 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69  2.b==t1.a).  Ski
95c0: 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20  p this term .   
95d0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73         ** and us
95e0: 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e  e its inversion.
95f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
9600: 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d  stcase( pOrTerm-
9610: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
9620: 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20  COPIED );.      
9630: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f      testcase( pO
9640: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9650: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
9660: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9670: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c  t( pOrTerm->wtFl
9680: 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49  ags & (TERM_COPI
9690: 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29  ED|TERM_VIRTUAL)
96a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
96b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
96c0: 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d  }.        iColum
96d0: 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  n = pOrTerm->u.l
96e0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
96f0: 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72     iCursor = pOr
9700: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
9710: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9730: 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
9740: 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74    /* No candidat
9750: 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77  e table+column w
9760: 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20  as found.  This 
9770: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20  can only occur. 
9780: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
9790: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
97a0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  n */.        ass
97b0: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
97c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 63 68       assert( (ch
97d0: 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e  ngToIN&(chngToIN
97e0: 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1))==0 );.     
97f0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54     assert( chngT
9800: 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61  oIN==getMask(pMa
9810: 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20  skSet, iCursor) 
9820: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9840: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29  testcase( j==1 )
9850: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68  ;..      /* We h
9860: 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64  ave found a cand
9870: 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20  idate table and 
9880: 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74  column.  Check t
9890: 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a 20 20  o see if that.  
98a0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
98b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f   column is commo
98c0: 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  n to every term 
98d0: 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65  in the OR clause
98e0: 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68   */.      okToCh
98f0: 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20  ngToIN = 1;.    
9900: 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20    for(; i>=0 && 
9910: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d  okToChngToIN; i-
9920: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9940: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
9950: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
9960: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
9970: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
9980: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
9990: 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61    pOrTerm->wtFla
99a0: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
99b0: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
99c0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e   if( pOrTerm->u.
99d0: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
99e0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
99f0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20   okToChngToIN = 
9a00: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
9a20: 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68  affLeft, affRigh
9a30: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;.          /* 
9a40: 49 66 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  If the right-han
9a50: 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61  d side is also a
9a60: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
9a70: 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20  e affinities.   
9a80: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74         ** of bot
9a90: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
9aa0: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
9ab0: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
9ac0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
9ad0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
9ae0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
9af0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
9b00: 32 34 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a  249).          *
9b10: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 52  /.          affR
9b20: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
9b30: 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65  prAffinity(pOrTe
9b40: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
9b50: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66  t);.          af
9b60: 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  fLeft = sqlite3E
9b70: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54  xprAffinity(pOrT
9b80: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
9b90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
9ba0: 28 20 61 66 66 52 69 67 68 74 21 3d 30 20 26 26  ( affRight!=0 &&
9bb0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
9bc0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
9bd0: 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d    okToChngToIN =
9be0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
9bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9c00: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
9c10: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
9c20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9c40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9c50: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f  this point, okTo
9c60: 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65  ChngToIN is true
9c70: 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65   if original pTe
9c80: 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20 20 20  rm satisfies.   
9c90: 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20   ** case 1.  In 
9ca0: 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74  that case, const
9cb0: 72 75 63 74 20 61 20 6e 65 77 20 76 69 72 74 75  ruct a new virtu
9cc0: 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  al term that is 
9cd0: 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f  .    ** pTerm co
9ce0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
9cf0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
9d00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a 20 52   **.    ** EV: R
9d10: 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20 20 20  -00211-15100.   
9d20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f   */.    if( okTo
9d30: 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  ChngToIN ){.    
9d40: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20    Expr *pDup;   
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72           /* A tr
9d60: 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74  ansient duplicat
9d70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
9d80: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
9d90: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20  pList = 0;   /* 
9da0: 54 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  The RHS of the I
9db0: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
9dc0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
9dd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  = 0;       /* Th
9de0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
9df0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9e00: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9e20: 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72  complete IN oper
9e30: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ator */..      f
9e40: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
9e50: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
9e60: 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Wc->a; i>=0; i--
9e70: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
9e80: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
9e90: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9ea0: 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63  RM_OR_OK)==0 ) c
9eb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9ec0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
9ed0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
9ee0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EQ );.        as
9ef0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c  sert( pOrTerm->l
9f00: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73  eftCursor==iCurs
9f10: 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  or );.        as
9f20: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75  sert( pOrTerm->u
9f30: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  .leftColumn==iCo
9f40: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
9f50: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9f60: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72  prDup(db, pOrTer
9f70: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
9f80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
9f90: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9fa0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d  rListAppend(pWC-
9fb0: 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  >pParse, pList, 
9fc0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70  pDup);.        p
9fd0: 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e  Left = pOrTerm->
9fe0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
a010: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
a020: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a030: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
a040: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   pNew = sqlite3P
a050: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a060: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
a070: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
a080: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
a090: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
a0a0: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
a0b0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
a0c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a0d0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a0e0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
a0f0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
a100: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a110: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
a120: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
a130: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
a140: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54   pNew, TERM_VIRT
a150: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
a160: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
a170: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
a180: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
a190: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
a1a0: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
a1b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
a1c0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
a1d0: 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
a1e0: 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w].iParent = idx
a1f0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
a200: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
a210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a230: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
a240: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
a250: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70        pTerm->eOp
a260: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50  erator = WO_NOOP
a270: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75  ;  /* case 1 tru
a280: 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20  mps case 2 */.  
a290: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
a2a0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
a2b0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
a2c0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
a2d0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f  _SUBQUERY */.../
a2e0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
a2f0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
a300: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
a310: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
a320: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
a330: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
a340: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
a350: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
a360: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
a370: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
a380: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
a390: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
a3a0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
a3b0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
a3c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a3d0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a3e0: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
a3f0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
a400: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
a410: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
a420: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
a430: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
a440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a450: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
a460: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
a470: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
a480: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
a490: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
a4a0: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
a4b0: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
a4c0: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
a4d0: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
a4e0: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
a4f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a500: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
a510: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
a520: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a530: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a540: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
a550: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
a560: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a570: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
a580: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
a590: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
a5a0: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
a5b0: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
a5c0: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
a5d0: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
a5e0: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
a5f0: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
a600: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a610: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
a620: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
a630: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
a640: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
a650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
a660: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
a670: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
a680: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
a690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a6a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
a6b0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a6c0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
a6d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a6e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
a6f0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
a700: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
a710: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a720: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
a730: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a750: 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
a760: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68  analyzed */.  Wh
a770: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
a780: 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  kSet;          /
a790: 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69  * Set of table i
a7a0: 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20  ndex masks */.  
a7b0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
a7e0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
a7f0: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
a800: 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20  rereqLeft;      
a810: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65          /* Prere
a820: 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65 20  quesites of the 
a830: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a  pExpr->pLeft */.
a840: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
a850: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
a860: 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69     /* Prerequesi
a870: 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  tes of pExpr */.
a880: 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52    Bitmask extraR
a890: 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ight = 0;       
a8a0: 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65     /* Extra depe
a8b0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54  ndencies on LEFT
a8c0: 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20   JOIN */.  Expr 
a8d0: 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20  *pStr1 = 0;     
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a8f0: 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20  HS of LIKE/GLOB 
a900: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
a910: 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  t isComplete = 0
a920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a930: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
a940: 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c  OB ends with wil
a950: 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  dcard */.  int n
a960: 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20  oCase = 0;      
a970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a980: 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e 67  IKE/GLOB disting
a990: 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a 20  uishes case */. 
a9a0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f    /* Top-level o
a9d0: 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d  perator.  pExpr-
a9e0: 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  >op */.  Parse *
a9f0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
aa00: 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50 61 72  arse;     /* Par
aa10: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
aa20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
aa30: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
aa40: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
aa50: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
aa60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
aa70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
aa80: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  rn;.  }.  pTerm 
aa90: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aaa0: 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d  m];.  pMaskSet =
aab0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
aac0: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
aad0: 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71  >pExpr;.  prereq
aae0: 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65  Left = exprTable
aaf0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ab00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ab10: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
ab20: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
ab30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ab40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
ab50: 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72   );.    if( Expr
ab60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ab70: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
ab80: 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
ab90: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
aba0: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
abb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
abc0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
abd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
abe0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
abf0: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
ac00: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ac10: 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  et, pExpr->x.pLi
ac20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  st);.    }.  }el
ac30: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53  se if( op==TK_IS
ac40: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72  NULL ){.    pTer
ac50: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ac60: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
ac70: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
ac80: 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ght = exprTableU
ac90: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
aca0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
acb0: 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d   }.  prereqAll =
acc0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
acd0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29  pMaskSet, pExpr)
ace0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
acf0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ad00: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
ad10: 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67     Bitmask x = g
ad20: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
ad30: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
ad40: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72  inTable);.    pr
ad50: 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20  ereqAll |= x;.  
ad60: 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78    extraRight = x
ad70: 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73  -1;  /* ON claus
ad80: 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20  e terms may not 
ad90: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
ada0: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20  index.          
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
adc0: 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  on left table of
add0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54   a LEFT JOIN.  T
ade0: 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20  icket #3015 */. 
adf0: 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72   }.  pTerm->prer
ae00: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
ae10: 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74  l;.  pTerm->left
ae20: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
ae30: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20  Term->iParent = 
ae40: 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70  -1;.  pTerm->eOp
ae50: 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66  erator = 0;.  if
ae60: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20  ( allowedOp(op) 
ae70: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
ae80: 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c  qRight & prereqL
ae90: 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  eft)==0 ){.    E
aea0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
aeb0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45  pr->pLeft;.    E
aec0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
aed0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
aee0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
aef0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
af00: 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75     pTerm->leftCu
af10: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
af20: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72  able;.      pTer
af30: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
af40: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
af50: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  ;.      pTerm->e
af60: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
af70: 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20  torMask(op);.   
af80: 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68   }.    if( pRigh
af90: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d  t && pRight->op=
afa0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
afb0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
afc0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
afd0: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
afe0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
aff0: 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  or>=0 ){.       
b000: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
b010: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
b020: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b030: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
b040: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
b050: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
b060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b070: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
b080: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b090: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
b0a0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
b0b0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b0c0: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
b0d0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b0e0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
b0f0: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
b100: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
b110: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
b120: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
b130: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
b140: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
b150: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b160: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
b170: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
b180: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
b190: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
b1a0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
b1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1c0: 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20   pDup = pExpr;. 
b1d0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
b1e0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
b1f0: 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70     exprCommute(p
b200: 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20  Parse, pDup);.  
b210: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70      pLeft = pDup
b220: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  ->pLeft;.      p
b230: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
b240: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
b250: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c  .      pNew->u.l
b260: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
b270: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
b280: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 72 65    testcase( (pre
b290: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
b2a0: 69 67 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c  ight) != prereqL
b2b0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  eft );.      pNe
b2c0: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
b2d0: 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78   prereqLeft | ex
b2e0: 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20  traRight;.      
b2f0: 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20  pNew->prereqAll 
b300: 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  = prereqAll;.   
b310: 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74     pNew->eOperat
b320: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
b330: 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20  k(pDup->op);.   
b340: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
b350: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
b360: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
b370: 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20  .  /* If a term 
b380: 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f  is the BETWEEN o
b390: 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20  perator, create 
b3a0: 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20  two new virtual 
b3b0: 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  terms.  ** that 
b3c0: 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65  define the range
b3d0: 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45   that the BETWEE
b3e0: 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46  N implements.  F
b3f0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
b400: 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45 54  .  **      a BET
b410: 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a  WEEN b AND c.  *
b420: 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72  *.  ** is conver
b430: 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20  ted into:.  **. 
b440: 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54 57   **      (a BETW
b450: 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e 44  EEN b AND c) AND
b460: 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d   (a>=b) AND (a<=
b470: 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  c).  **.  ** The
b480: 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20 61   two new terms a
b490: 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  re added onto th
b4a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68 65  e end of the Whe
b4b0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e  reClause object.
b4c0: 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74 65  .  ** The new te
b4d0: 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69 63  rms are "dynamic
b4e0: 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64 72  " and are childr
b4f0: 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  en of the origin
b500: 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20  al BETWEEN.  ** 
b510: 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e  term.  That mean
b520: 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42 45  s that if the BE
b530: 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63 6f  TWEEN term is co
b540: 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72 65  ded, the childre
b550: 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70  n are.  ** skipp
b560: 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  ed.  Or, if the 
b570: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61 74  children are sat
b580: 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e 64  isfied by an ind
b590: 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ex, the original
b5a0: 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74 65  .  ** BETWEEN te
b5b0: 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  rm is skipped.. 
b5c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
b5d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
b5e0: 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d  WEEN && pWC->op=
b5f0: 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45  =TK_AND ){.    E
b600: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
b610: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
b620: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b630: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
b640: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
b650: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
b660: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
b670: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
b680: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
b690: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
b6a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
b6b0: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
b6c0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
b6d0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
b6e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b6f0: 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20  rse, ops[i], .  
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b720: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
b730: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a  xpr->pLeft, 0),.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b760: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b770: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
b780: 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20  r, 0), 0);.     
b790: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
b7a0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
b7b0: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
b7c0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
b7d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73  AMIC);.      tes
b7e0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
b7f0: 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e   );.      exprAn
b800: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
b810: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
b820: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
b830: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
b840: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
b850: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
b870: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
b880: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b890: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
b8a0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b8b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b8c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
b8d0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
b8e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
b900: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  /* Analyze a ter
b910: 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73  m that is compos
b920: 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ed of two or mor
b930: 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65  e subterms conne
b940: 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20  cted by.  ** an 
b950: 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  OR operator..  *
b960: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
b970: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b  pr->op==TK_OR ){
b980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43  .    assert( pWC
b990: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ->op==TK_AND );.
b9a0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f      exprAnalyzeO
b9b0: 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c  rTerm(pSrc, pWC,
b9c0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70   idxTerm);.    p
b9d0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
b9e0: 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e  dxTerm];.  }.#en
b9f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ba00: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ba10: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
ba20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
ba30: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
ba40: 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74  * Add constraint
ba50: 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  s to reduce the 
ba60: 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20  search space on 
ba70: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20  a LIKE or GLOB. 
ba80: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   ** operator..  
ba90: 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70  **.  ** A like p
baa0: 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f  attern of the fo
bab0: 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63 25  rm "x LIKE 'abc%
bac0: 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e  '" is changed in
bad0: 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  to constraints. 
bae0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
baf0: 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20 78    x>='abc' AND x
bb00: 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b  <'abd' AND x LIK
bb10: 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20  E 'abc%'.  **.  
bb20: 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72  ** The last char
bb30: 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65  acter of the pre
bb40: 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63  fix "abc" is inc
bb50: 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d  remented to form
bb60: 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e   the.  ** termin
bb70: 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20  ation condition 
bb80: 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66  "abd"..  */.  if
bb90: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  ( pWC->op==TK_AN
bba0: 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65 4f  D .   && isLikeO
bbb0: 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70 45  rGlob(pParse, pE
bbc0: 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69 73  xpr, &pStr1, &is
bbd0: 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73  Complete, &noCas
bbe0: 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  e).  ){.    Expr
bbf0: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 2f   *pLeft;       /
bc00: 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * LHS of LIKE/GL
bc10: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
bc20: 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b 20     Expr *pStr2; 
bc30: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
bc40: 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66 20   pStr1 - RHS of 
bc50: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
bc60: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
bc70: 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20 45  pNewExpr1;.    E
bc80: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  xpr *pNewExpr2;.
bc90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 3b      int idxNew1;
bca0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 32  .    int idxNew2
bcb0: 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
bcc0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  Coll;    /* Coll
bcd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
bce0: 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20 70 4c  o use */..    pL
bcf0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  eft = pExpr->x.p
bd00: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
bd10: 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  ;.    pStr2 = sq
bd20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bd30: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
bd40: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
bd50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75  ailed ){.      u
bd60: 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20  8 c, *pC;       
bd70: 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65  /* Last characte
bd80: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
bd90: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20  st wildcard */. 
bda0: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
bdb0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pStr2->u.zToken[
bdc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
bdd0: 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pStr2->u.zToken)
bde0: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
bdf0: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
be00: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
be10: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20  /* The point is 
be20: 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
be30: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
be40: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
be50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64  .        ** wild
be60: 63 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65  card.  But if we
be70: 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20   increment '@', 
be80: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69  that will push i
be90: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
bea0: 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63     ** alphabetic
beb0: 20 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73   range where cas
bec0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69  e conversions wi
bed0: 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a  ll mess up the .
bee0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75          ** inequ
bef0: 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64  ality.  To avoid
bf00: 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65   this, make sure
bf10: 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65   to also run the
bf20: 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   full.        **
bf30: 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e   LIKE on all can
bf40: 64 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f  didate expressio
bf50: 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74  ns by clearing t
bf60: 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c  he isComplete fl
bf70: 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ag.        */.  
bf80: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27        if( c=='A'
bf90: 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20  -1 ) isComplete 
bfa0: 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20 52 2d  = 0;   /* EV: R-
bfb0: 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f 0a 0a  64339-08207 */..
bfc0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c  .        c = sql
bfd0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
bfe0: 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [c];.      }.   
bff0: 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a     *pC = c + 1;.
c000: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
c010: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
c020: 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
c030: 55 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f 20 22  UTF8, noCase ? "
c040: 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41 52  NOCASE" : "BINAR
c050: 59 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  Y",0);.    pNewE
c060: 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
c070: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
c080: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
c090: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c0a0: 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c 69  ExprSetColl(sqli
c0b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c  te3ExprDup(db,pL
c0c0: 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a  eft,0), pColl),.
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a       pStr1, 0);.
c0f0: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
c100: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c110: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
c120: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
c130: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
c140: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
c150: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
c160: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
c170: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
c180: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
c190: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c1a0: 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20  , TK_LT,.       
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c1c0: 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c  lite3ExprSetColl
c1d0: 28 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  (sqlite3ExprDup(
c1e0: 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f  db,pLeft,0), pCo
c1f0: 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ll),.           
c200: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c            pStr2,
c210: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
c220: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
c230: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
c240: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
c250: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
c260: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
c270: 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20  dxNew2==0 );.   
c280: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
c290: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29  c, pWC, idxNew2)
c2a0: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
c2b0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c2c0: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65      if( isComple
c2d0: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d  te ){.      pWC-
c2e0: 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61 72  >a[idxNew1].iPar
c2f0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
c300: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
c310: 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew2].iParent = i
c320: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
c330: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
c340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c350: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c360: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
c370: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
c380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
c390: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
c3a0: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
c3b0: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
c3c0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
c3d0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
c3e0: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
c3f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
c400: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
c410: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
c420: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
c430: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
c440: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
c450: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
c460: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
c470: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
c480: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
c490: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
c4a0: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
c4b0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
c4c0: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
c4d0: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
c4e0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c4f0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
c500: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
c510: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
c520: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
c530: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
c540: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
c550: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
c560: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c570: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
c580: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
c590: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
c5a0: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
c5b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
c5c0: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
c5d0: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
c5e0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
c5f0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
c600: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
c610: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
c620: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
c630: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
c640: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
c650: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
c660: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
c670: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
c6a0: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
c6b0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
c6c0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
c6d0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
c6e0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
c6f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
c700: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c710: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
c720: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
c730: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
c740: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c750: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
c760: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
c770: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
c780: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
c790: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
c7a0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
c7b0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
c7c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
c7d0: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
c7e0: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
c7f0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
c800: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
c810: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
c820: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
c830: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
c840: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
c850: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c860: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
c870: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c880: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
c890: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
c8a0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
c8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
c8c0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
c8d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c8e0: 45 5f 53 54 41 54 33 0a 20 20 2f 2a 20 57 68 65  E_STAT3.  /* Whe
c8f0: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68  n sqlite_stat3 h
c900: 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73  istogram data is
c910: 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70   available an op
c920: 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20 20  erator of the.  
c930: 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f  ** form "x IS NO
c940: 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65  T NULL" can some
c950: 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61 74  times be evaluat
c960: 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ed more efficien
c970: 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e  tly.  ** as "x>N
c980: 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f 74  ULL" if x is not
c990: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c9a0: 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e  ARY KEY.  So con
c9b0: 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76 69  struct a.  ** vi
c9c0: 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74 68  rtual term of th
c9d0: 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20  at form..  **.  
c9e0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
c9f0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d 75   virtual term mu
ca00: 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69 74  st be tagged wit
ca10: 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54  h TERM_VNULL.  T
ca20: 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56 4e  his.  ** TERM_VN
ca30: 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75 70  ULL tag will sup
ca40: 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e 75  press the not-nu
ca50: 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65 20  ll check at the 
ca60: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
ca70: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69 74  f the loop.  Wit
ca80: 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56 4e  hout the TERM_VN
ca90: 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e 6f  ULL flag, the no
caa0: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 0a  t-null check at.
cab0: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
cac0: 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20  f the loop will 
cad0: 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73 75  prevent any resu
cae0: 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 72  lts from being r
caf0: 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  eturned..  */.  
cb00: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
cb10: 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
cb20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
cb30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
cb40: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
cb50: 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a  iColumn>=0.  ){.
cb60: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
cb70: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  pr;.    Expr *pL
cb80: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
cb90: 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  ft;.    int idxN
cba0: 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ew;.    WhereTer
cbb0: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20  m *pNewTerm;..  
cbc0: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
cbd0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cbe0: 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20  , TK_GT,.       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cc10: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
cc20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cc40: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
cc50: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
cc60: 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20  0, 0), 0);..    
cc70: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
cc80: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
cc90: 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20  pNewExpr,.      
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52          TERM_VIR
ccc0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ccd0: 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20  C|TERM_VNULL);. 
cce0: 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b     if( idxNew ){
ccf0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
cd00: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
cd10: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
cd20: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
cd30: 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65   0;.      pNewTe
cd40: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
cd50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
cd60: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
cd70: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
cd80: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
cd90: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
cda0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54  Operator = WO_GT
cdb0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cdc0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
cdd0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
cde0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
cdf0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
ce00: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
ce10: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
ce20: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
ce30: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
ce40: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
ce50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
ce60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ce70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
ce80: 4c 45 5f 53 54 41 54 20 2a 2f 0a 0a 20 20 2f 2a  LE_STAT */..  /*
ce90: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
cea0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
ceb0: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
cec0: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
ced0: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
cee0: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
cef0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
cf00: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
cf10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
cf20: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
cf30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
cf40: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
cf50: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
cf60: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
cf70: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
cf80: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
cf90: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
cfa0: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
cfb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cfc0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
cfd0: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
cfe0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
cff0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
d000: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
d010: 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d  list */.  WhereM
d020: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
d030: 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  ,   /* Mapping f
d040: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
d050: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
d060: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
d070: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
d080: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
d090: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
d0a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
d0b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
d0c0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
d0d0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
d0e0: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
d0f0: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
d100: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
d110: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
d120: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
d130: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
d140: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
d150: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
d160: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
d170: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
d180: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
d190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
d1a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d1b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d1c0: 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20 65  n searches the e
d1d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
d1e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d1f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
d200: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
d210: 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c  n of type TK_COL
d220: 55 4d 4e 20 74 68 61 74 20 72 65 66 65 72 73 20  UMN that refers 
d230: 74 6f 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  to the same colu
d240: 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74  mn and.** uses t
d250: 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f  he same collatio
d260: 6e 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68  n sequence as th
d270: 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e  e iCol'th column
d280: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a   of index pIdx..
d290: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 42 61 73  ** Argument iBas
d2a0: 65 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  e is the cursor 
d2b0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
d2c0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70  the table that p
d2d0: 49 64 78 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f  Idx refers.** to
d2e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
d2f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
d300: 20 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65   found, its inde
d310: 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20  x in pList->a[] 
d320: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  is returned. If.
d330: 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e  ** no expression
d340: 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73   is found, -1 is
d350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d360: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64  atic int findInd
d370: 65 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a  exCol(.  Parse *
d380: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d390: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d3a0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
d3b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d3d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
d3e0: 74 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  t to search */. 
d3f0: 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
d420: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
d430: 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49  with pIdx */.  I
d440: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d460: 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  * Index to match
d470: 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20   column of */.  
d480: 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  /* Column of ind
d4b0: 65 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29  ex to match */.)
d4c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
d4d0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
d4e0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43   pIdx->azColl[iC
d4f0: 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ol];..  for(i=0;
d500: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d510: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d520: 2a 70 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  *p = pList->a[i]
d530: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
d540: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
d550: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c  .     && p->iCol
d560: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
d570: 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26  umn[iCol].     &
d580: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
d590: 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  se.    ){.      
d5a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
d5b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d5c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
d5d0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
d5e0: 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71  (pColl) && 0==sq
d5f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
d600: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c  ll->zName, zColl
d610: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
d620: 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  urn i;.      }. 
d630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d640: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
d650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 74  This routine det
d660: 65 72 6d 69 6e 65 73 20 69 66 20 70 49 64 78 20  ermines if pIdx 
d670: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
d680: 73 73 69 73 74 20 69 6e 20 70 72 6f 63 65 73 73  ssist in process
d690: 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43  ing a.** DISTINC
d6a0: 54 20 71 75 61 6c 69 66 69 65 72 2e 20 49 6e 20  T qualifier. In 
d6b0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
d6c0: 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72  tests whether or
d6d0: 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 69 73 0a   not using this.
d6e0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
d6f0: 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67 75 61 72   outer loop guar
d700: 61 6e 74 65 65 73 20 74 68 61 74 20 72 6f 77 73  antees that rows
d710: 20 77 69 74 68 20 65 71 75 61 6c 20 76 61 6c 75   with equal valu
d720: 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78  es for.** all ex
d730: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
d740: 20 70 44 69 73 74 69 6e 63 74 20 6c 69 73 74 20   pDistinct list 
d750: 61 72 65 20 64 65 6c 69 76 65 72 65 64 20 67 72  are delivered gr
d760: 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 0a  ouped together..
d770: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
d780: 65 2c 20 74 68 65 20 71 75 65 72 79 20 0a 2a 2a  e, the query .**
d790: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 44 49 53  .**   SELECT DIS
d7a0: 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46 52  TINCT a, b, c FR
d7b0: 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
d7c0: 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e   ?.**.** can ben
d7d0: 65 66 69 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e  efit from any in
d7e0: 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22  dex on columns "
d7f0: 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73  b" and "c"..*/.s
d800: 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74  tatic int isDist
d810: 69 6e 63 74 49 6e 64 65 78 28 0a 20 20 50 61 72  inctIndex(.  Par
d820: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d840: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d850: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
d860: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
d870: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
d880: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  E clause */.  In
d890: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8b0: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
d8c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20   considered */. 
d8d0: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
d900: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
d910: 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20  pIdx is on */.  
d920: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
d930: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  nct,            
d940: 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
d950: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  expressions */. 
d960: 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20 20 20 20   int nEqCol     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
d990: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
d9a0: 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d   == */.){.  Bitm
d9b0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20  ask mask = 0;   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
d9d0: 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74  ask of unaccount
d9e0: 65 64 20 66 6f 72 20 70 44 69 73 74 69 6e 63 74  ed for pDistinct
d9f0: 20 65 78 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20   exprs */.  int 
da00: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
da10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
da20: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
da30: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 49 64 78 2d   */..  if( pIdx-
da40: 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69  >zName==0 || pDi
da50: 73 74 69 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69  stinct==0 || pDi
da60: 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42  stinct->nExpr>=B
da70: 4d 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MS ) return 0;. 
da80: 20 74 65 73 74 63 61 73 65 28 20 70 44 69 73 74   testcase( pDist
da90: 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53  inct->nExpr==BMS
daa0: 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  -1 );..  /* Loop
dab0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
dac0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
dad0: 74 68 65 20 64 69 73 74 69 6e 63 74 20 6c 69 73  the distinct lis
dae0: 74 2e 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  t. If any of the
daf0: 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73  m.  ** are not s
db00: 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66  imple column ref
db10: 65 72 65 6e 63 65 73 2c 20 72 65 74 75 72 6e 20  erences, return 
db20: 65 61 72 6c 79 2e 20 4f 74 68 65 72 77 69 73 65  early. Otherwise
db30: 2c 20 74 65 73 74 20 69 66 20 74 68 65 0a 20 20  , test if the.  
db40: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
db50: 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d  contains a "col=
db60: 58 22 20 63 6c 61 75 73 65 2e 20 49 66 20 69 74  X" clause. If it
db70: 20 64 6f 65 73 2c 20 74 68 65 20 65 78 70 72 65   does, the expre
db80: 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62  ssion.  ** can b
db90: 65 20 69 67 6e 6f 72 65 64 2e 20 49 66 20 69 74  e ignored. If it
dba0: 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74   does not, and t
dbb0: 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e  he column does n
dbc0: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65  ot belong to the
dbd0: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
dbe0: 20 61 73 20 69 6e 64 65 78 20 70 49 64 78 2c 20   as index pIdx, 
dbf0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 46 69  return early. Fi
dc00: 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65 72 65 20  nally, if there 
dc10: 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  is no.  ** match
dc20: 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65 78 70 72  ing "col=X" expr
dc30: 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 63  ession and the c
dc40: 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20  olumn is on the 
dc50: 73 61 6d 65 20 74 61 62 6c 65 20 61 73 20 70 49  same table as pI
dc60: 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  dx,.  ** set the
dc70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
dc80: 69 74 20 69 6e 20 76 61 72 69 61 62 6c 65 20 6d  it in variable m
dc90: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ask..  */.  for(
dca0: 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74  i=0; i<pDistinct
dcb0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
dcc0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
dcd0: 65 72 6d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  erm;.    Expr *p
dce0: 20 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b   = pDistinct->a[
dcf0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
dd00: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
dd10: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
dd20: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
dd30: 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69 54 61 62  erm(pWC, p->iTab
dd40: 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  le, p->iColumn, 
dd50: 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f  ~(Bitmask)0, WO_
dd60: 45 51 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  EQ, 0);.    if( 
dd70: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 45  pTerm ){.      E
dd80: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
dd90: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
dda0: 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73 71 6c 69  llSeq *p1 = sqli
ddb0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
ddc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ddd0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70  pX->pLeft, pX->p
dde0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 43 6f  Right);.      Co
ddf0: 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73 71 6c 69  llSeq *p2 = sqli
de00: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
de10: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
de20: 20 69 66 28 20 70 31 3d 3d 70 32 20 29 20 63 6f   if( p1==p2 ) co
de30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
de40: 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 21    if( p->iTable!
de50: 3d 62 61 73 65 20 29 20 72 65 74 75 72 6e 20 30  =base ) return 0
de60: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28  ;.    mask |= ((
de70: 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69  (Bitmask)1) << i
de80: 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  );.  }..  for(i=
de90: 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20  nEqCol; mask && 
dea0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
deb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
dec0: 45 78 70 72 20 3d 20 66 69 6e 64 49 6e 64 65 78  Expr = findIndex
ded0: 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73  Col(pParse, pDis
dee0: 74 69 6e 63 74 2c 20 62 61 73 65 2c 20 70 49 64  tinct, base, pId
def0: 78 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 69  x, i);.    if( i
df00: 45 78 70 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a  Expr<0 ) break;.
df10: 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28      mask &= ~(((
df20: 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45  Bitmask)1) << iE
df30: 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  xpr);.  }..  ret
df40: 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d  urn (mask==0);.}
df50: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
df60: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
df70: 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
df80: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
df90: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
dfa0: 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
dfb0: 74 2e 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  t. A DISTINCT li
dfc0: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
dfd0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
dfe0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e  contains a.** UN
dff0: 49 51 55 45 20 69 6e 64 65 78 20 74 68 61 74 20  IQUE index that 
e000: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e010: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
e020: 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  e query will be 
e030: 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77  distinct.** anyw
e040: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
e050: 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
e060: 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
e070: 70 50 61 72 73 65 2c 0a 20 20 53 72 63 4c 69 73  pParse,.  SrcLis
e080: 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a 20 20 57  t *pTabList,.  W
e090: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
e0a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
e0b0: 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c  stinct.){.  Tabl
e0c0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
e0d0: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b   *pIdx;.  int i;
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74            .  int
e100: 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66   iBase;..  /* If
e110: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
e120: 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72  han one table or
e130: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74   sub-select in t
e140: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
e150: 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72  f.  ** this quer
e160: 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  y, then it will 
e170: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
e180: 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65  to show that the
e190: 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20   DISTINCT .  ** 
e1a0: 63 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64  clause is redund
e1b0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54  ant. */.  if( pT
e1c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20  abList->nSrc!=1 
e1d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42  ) return 0;.  iB
e1e0: 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ase = pTabList->
e1f0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
e200: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
e210: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
e220: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
e230: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61  expressions is a
e240: 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20  n IPK column on 
e250: 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65  table iBase, the
e260: 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74  n return .  ** t
e270: 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28  rue. Note: The (
e280: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
e290: 29 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  ) part of this t
e2a0: 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65  est may be false
e2b0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
e2c0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61  rent SELECT is a
e2d0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
e2e0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
e2f0: 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e  r(i=0; i<pDistin
e300: 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ct->nExpr; i++){
e310: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
e320: 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
e330: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  Expr;.    if( p-
e340: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e350: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
e360: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
e370: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
e390: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
e3a0: 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
e3b0: 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
e3c0: 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
e3d0: 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
e3e0: 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
e3f0: 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
e400: 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
e410: 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
e420: 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
e430: 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
e440: 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
e450: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
e460: 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
e470: 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
e480: 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
e490: 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
e4a0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
e4b0: 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
e4c0: 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
e4d0: 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
e4e0: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
e4f0: 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
e500: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e510: 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
e520: 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
e530: 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
e540: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
e550: 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
e560: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  he index..  */. 
e570: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e580: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e590: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e5a0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f  .    if( pIdx->o
e5b0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
e5c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e5d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
e5e0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
e5f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e600: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e610: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i];.      if( 0=
e620: 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  =findTerm(pWC, i
e630: 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69  Base, iCol, ~(Bi
e640: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
e650: 70 49 64 78 29 20 0a 20 20 20 20 20 20 20 26 26  pIdx) .       &&
e660: 20 30 3e 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28   0>findIndexCol(
e670: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
e680: 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c 20  t, iBase, pIdx, 
e690: 69 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  i).      ){.    
e6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e6b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e6c0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
e6d0: 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  n ){.      /* Th
e6e0: 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65 73  is index implies
e6f0: 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
e700: 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  CT qualifier is 
e710: 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20  redundant. */.  
e720: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
e740: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
e750: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
e760: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
e770: 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
e780: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
e790: 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74  * clause.  If it
e7a0: 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73   can, it returns
e7b0: 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e   1.  If pIdx can
e7c0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a  not satisfy the.
e7d0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
e7e0: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
e7f0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
e800: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
e810: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e820: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
e830: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
e840: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
e850: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
e860: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e870: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
e880: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
e890: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
e8a0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
e8b0: 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
e8c0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
e8d0: 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43  pTab..**.** nEqC
e8e0: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
e8f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70   of columns of p
e900: 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65  Idx that are use
e910: 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a  d as equality.**
e920: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41   constraints.  A
e930: 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75  ny of these colu
e940: 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69  mns may be missi
e950: 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  ng from the ORDE
e960: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61  R BY.** clause a
e970: 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
e980: 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
e990: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
e9a0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
e9b0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
e9c0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
e9d0: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
e9e0: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
e9f0: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
ea00: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ea10: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
ea20: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
ea30: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
ea40: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
ea50: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
ea60: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
ea70: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
ea80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ea90: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
eaa0: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
eab0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
eac0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
ead0: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
eae0: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
eaf0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
eb00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
eb10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
eb20: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
eb30: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
eb40: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
eb50: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
eb60: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 70 73 20  bers to bitmaps 
eb70: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
eb80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
eb90: 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
eba0: 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
ebb0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
ebc0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
ebd0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
ebe0: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
ebf0: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
ec00: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
ec10: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
ec20: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
ec30: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
ec40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ec50: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69  index columns wi
ec60: 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  th == constraint
ec70: 73 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61  s */.  int wsFla
ec80: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
ec90: 2a 20 49 6e 64 65 78 20 75 73 61 67 65 73 20 66  * Index usages f
eca0: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
ecb0: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
ecc0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
ecd0: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
ece0: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
ecf0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
ed00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ed10: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
ed20: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
ed30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ed40: 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20  /* XOR of index 
ed50: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72  and ORDER BY sor
ed60: 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  t direction */. 
ed70: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
eda0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
edb0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
edc0: 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20  t_item *pTerm;  
edd0: 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
ede0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
edf0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
ee00: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ee10: 3b 0a 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  ;..  if( !pOrder
ee20: 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  By ) return 0;. 
ee30: 20 69 66 28 20 77 73 46 6c 61 67 73 20 26 20 57   if( wsFlags & W
ee40: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
ee50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ee60: 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
ee70: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
ee80: 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42   nTerm = pOrderB
ee90: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  y->nExpr;.  asse
eea0: 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a  rt( nTerm>0 );..
eeb0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 70 49    /* Argument pI
eec0: 64 78 20 6d 75 73 74 20 65 69 74 68 65 72 20 70  dx must either p
eed0: 6f 69 6e 74 20 74 6f 20 61 20 27 72 65 61 6c 27  oint to a 'real'
eee0: 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 73 74 72   named index str
eef0: 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72  ucture, .  ** or
ef00: 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   an index struct
ef10: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e  ure allocated on
ef20: 20 74 68 65 20 73 74 61 63 6b 20 62 79 20 62 65   the stack by be
ef30: 73 74 42 74 72 65 65 49 6e 64 65 78 28 29 20 74  stBtreeIndex() t
ef40: 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74  o.  ** represent
ef50: 20 74 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78   the rowid index
ef60: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
ef70: 20 65 76 65 72 79 20 74 61 62 6c 65 2e 20 20 2a   every table.  *
ef80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  /.  assert( pIdx
ef90: 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78  ->zName || (pIdx
efa0: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
efb0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
efc0: 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20  ]==-1) );..  /* 
efd0: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
efe0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
eff0: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
f000: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
f010: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
f020: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
f030: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
f040: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
f050: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
f060: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
f070: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
f080: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
f090: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
f0a0: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
f0b0: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
f0c0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
f0d0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
f0e0: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
f0f0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
f100: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
f110: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
f120: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
f130: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
f140: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
f150: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
f160: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
f170: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
f180: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
f190: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
f1a0: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
f1b0: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
f1c0: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
f1d0: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
f1e0: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
f1f0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
f200: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
f210: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
f220: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
f230: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
f240: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
f250: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
f260: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
f270: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
f280: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
f290: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
f2a0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f2b0: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
f2c0: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
f2d0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
f2e0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
f2f0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
f300: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
f310: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
f320: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
f330: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
f340: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
f350: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
f360: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
f370: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
f380: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
f390: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
f3a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
f3b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
f3c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
f3d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
f3e0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
f3f0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
f400: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
f410: 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   if( pIdx->zName
f420: 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c   && i<pIdx->nCol
f430: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  umn ){.      iCo
f440: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43  lumn = pIdx->aiC
f450: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
f460: 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  if( iColumn==pId
f470: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
f480: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
f490: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
f4a0: 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  }.      iSortOrd
f4b0: 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
f4c0: 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  Order[i];.      
f4d0: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
f4e0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  Coll[i];.    }el
f4f0: 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  se{.      iColum
f500: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53  n = -1;.      iS
f510: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  ortOrder = 0;.  
f520: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c      zColl = pCol
f530: 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  l->zName;.    }.
f540: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
f550: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
f560: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
f570: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
f580: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
f590: 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65  /* Term j of the
f5a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f5b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f5c0: 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20  column i of the 
f5d0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
f5e0: 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i<nEqCol ){. 
f5f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
f600: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
f610: 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
f620: 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20   by == fails to 
f630: 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20  match an.       
f640: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
f650: 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20  m, that is OK.  
f660: 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74  Just ignore that
f670: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
f680: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ndex.        */.
f690: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f6a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f6b0: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( i==pIdx->nColu
f6c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mn ){.        /*
f6d0: 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20   Index column i 
f6e0: 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41  is the rowid.  A
f6f0: 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d  ll other terms m
f700: 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20  atch. */.       
f710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
f720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f730: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
f740: 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  mn fails to matc
f750: 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e  h and is not con
f760: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20  strained by ==. 
f770: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
f780: 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
f790: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
f7a0: 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e  R BY constraint.
f7b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f7c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f7e0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
f7f0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69  ortOrder!=0 || i
f800: 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20  Column==-1 );.  
f810: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
f820: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  >sortOrder==0 ||
f830: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
f840: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
f850: 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
f860: 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
f870: 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
f880: 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
f890: 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f  rder ^ pTerm->so
f8a0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
f8b0: 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i>nEqCol ){.   
f8c0: 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f     if( termSortO
f8d0: 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20  rder!=sortOrder 
f8e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
f8f0: 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62  dices can only b
f900: 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52  e used if all OR
f910: 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73  DER BY terms pas
f920: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
f930: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
f940: 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69  aints are all ei
f950: 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43  ther DESC or ASC
f960: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  . */.        ret
f970: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
f980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f990: 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d  sortOrder = term
f9a0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  SortOrder;.    }
f9b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54  .    j++;.    pT
f9c0: 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  erm++;.    if( i
f9d0: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66  Column<0 && !ref
f9e0: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
f9f0: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
fa00: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
fa10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
fa20: 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  he indexed colum
fa30: 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  n is the primary
fa40: 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74 68   key and everyth
fa50: 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20  ing matches.    
fa60: 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20    ** so far and 
fa70: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45  none of the ORDE
fa80: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68  R BY terms to th
fa90: 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e 63  e right referenc
faa0: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
fab0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
fac0: 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65  oin, then we are
fad0: 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74 68   assured that th
fae0: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
faf0: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  sed .      ** to
fb00: 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74 68   sort because th
fb10: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
fb20: 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e   unique and so n
fb30: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  one of the other
fb40: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
fb50: 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20  s will make any 
fb60: 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20  difference.     
fb70: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54   */.      j = nT
fb80: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  erm;.    }.  }..
fb90: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
fba0: 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a  rder!=0;.  if( j
fbb0: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f  >=nTerm ){.    /
fbc0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
fbd0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
fbe0: 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  se are covered b
fbf0: 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a  y this index so.
fc00: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65      ** this inde
fc10: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
fc20: 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  r sorting. */.  
fc30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
fc40: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
fc50: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
fc60: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
fc70: 0a 20 20 20 20 20 20 26 26 20 28 77 73 46 6c 61  .      && (wsFla
fc80: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
fc90: 4e 5f 4e 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20  N_NULL)==0.     
fca0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
fcb0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
fcc0: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
fcd0: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
fce0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
fcf0: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
fd00: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
fd10: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
fd20: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
fd30: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
fd40: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
fd50: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
fd60: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
fd70: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
fd80: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
fd90: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
fda0: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
fdb0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
fdc0: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
fdd0: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
fde0: 20 4e 6f 74 20 74 68 61 74 20 69 66 20 74 68 65   Not that if the
fdf0: 20 6d 61 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a   matching.    **
fe00: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 49 53   condition is IS
fe10: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72   NULL then the r
fe20: 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63  esult is not nec
fe30: 65 73 73 61 72 69 6c 79 20 75 6e 69 71 75 65 0a  essarily unique.
fe40: 20 20 20 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61      ** even on a
fe50: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 73   UNIQUE index, s
fe60: 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65  o disallow those
fe70: 20 63 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72   cases. */.    r
fe80: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
fe90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fea0: 2a 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64  * Prepare a crud
feb0: 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
fec0: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
fed0: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a  he input value..
fee0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e  ** The results n
fef0: 65 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74  eed not be exact
ff00: 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  .  This is only 
ff10: 75 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74  used for estimat
ff20: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c  ing.** the total
ff30: 20 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d   cost of perform
ff40: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ing operations w
ff50: 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f  ith O(logN) or O
ff60: 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c  (NlogN).** compl
ff70: 65 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20  exity.  Because 
ff80: 4e 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73  N is just a gues
ff90: 73 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61  s, it is no grea
ffa0: 74 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20  t tragedy if.** 
ffb0: 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65  logN is a little
ffc0: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
ffd0: 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f  double estLog(do
ffe0: 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c  uble N){.  doubl
fff0: 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f  e logN = 1;.  do
10000 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77  uble x = 10;.  w
10010 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20  hile( N>x ){.   
10020 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20   logN += 1;.    
10030 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72  x *= 10;.  }.  r
10040 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f  eturn logN;.}../
10050 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65  *.** Two routine
10060 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74  s for printing t
10070 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  he content of an
10080 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10090 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
100a0 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  .  Used for test
100b0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
100c0 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74  g only.  If neit
100d0 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45  her.** SQLITE_TE
100e0 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42  ST or SQLITE_DEB
100f0 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20  UG are defined, 
10100 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
10110 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70  nes.** are no-op
10120 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  s..*/.#if !defin
10130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10140 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
10150 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
10160 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
10170 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  d TRACE_IDX_INPU
10180 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
10190 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
101a0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
101b0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
101c0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
101d0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
101e0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
101f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10200 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25  ("  constraint[%
10210 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69  d]: col=%d termi
10220 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c  d=%d op=%d usabl
10230 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ed=%d\n",.      
10240 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
10250 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f  onstraint[i].iCo
10260 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
10270 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
10280 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20  TermOffset,.    
10290 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
102a0 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20  t[i].op,.       
102b0 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
102c0 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20  ].usable);.  }. 
102d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
102e0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
102f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
10300 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79  rintf("  orderby
10310 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73  [%d]: col=%d des
10320 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
10330 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72  i,.       p->aOr
10340 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
10350 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
10360 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20  erBy[i].desc);. 
10370 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
10380 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
10390 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  TS(sqlite3_index
103a0 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74  _info *p){.  int
103b0 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   i;.  if( !sqlit
103c0 65 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72  e3WhereTrace ) r
103d0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
103e0 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  ; i<p->nConstrai
103f0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  nt; i++){.    sq
10400 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
10410 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61  ("  usage[%d]: a
10420 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25  rgvIdx=%d omit=%
10430 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
10440 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
10450 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
10460 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  gvIndex,.       
10470 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  p->aConstraintUs
10480 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20  age[i].omit);.  
10490 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
104a0 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d  Printf("  idxNum
104b0 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75  =%d\n", p->idxNu
104c0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  m);.  sqlite3Deb
104d0 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53  ugPrintf("  idxS
104e0 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78  tr=%s\n", p->idx
104f0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
10500 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
10510 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64  derByConsumed=%d
10520 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43  \n", p->orderByC
10530 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69  onsumed);.  sqli
10540 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
10550 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d    estimatedCost=
10560 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61  %g\n", p->estima
10570 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73  tedCost);.}.#els
10580 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  e.#define TRACE_
10590 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64  IDX_INPUTS(A).#d
105a0 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
105b0 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69  OUTPUTS(A).#endi
105c0 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72  f../* .** Requir
105d0 65 64 20 62 65 63 61 75 73 65 20 62 65 73 74 49  ed because bestI
105e0 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
105f0 20 62 79 20 62 65 73 74 4f 72 43 6c 61 75 73 65   by bestOrClause
10600 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74  Index() .*/.stat
10610 69 63 20 76 6f 69 64 20 62 65 73 74 49 6e 64 65  ic void bestInde
10620 78 28 0a 20 20 20 20 50 61 72 73 65 2a 2c 20 57  x(.    Parse*, W
10630 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 73 74 72  hereClause*, str
10640 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10650 2a 2c 0a 20 20 20 20 42 69 74 6d 61 73 6b 2c 20  *,.    Bitmask, 
10660 42 69 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73  Bitmask, ExprLis
10670 74 2a 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b  t*, WhereCost*);
10680 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10690 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
106a0 20 66 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e   find an scannin
106b0 67 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  g strategy that 
106c0 63 61 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  can be used .** 
106d0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27  to optimize an '
106e0 4f 52 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74  OR' expression t
106f0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
10700 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a   WHERE clause. .
10710 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
10720 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10730 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
10740 20 70 53 72 63 20 6d 61 79 20 62 65 20 65 69 74   pSrc may be eit
10750 68 65 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72  her a.** regular
10760 20 42 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72   B-Tree table or
10770 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10790 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
107a0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
107b0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
107c0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
107d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
107e0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
107f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10800 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10810 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
10820 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
10830 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
10840 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
10850 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
10860 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
10870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
10880 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  sors not availab
10890 6c 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  le for indexing 
108a0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
108b0 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20 20 20  Valid,          
108c0 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e 6f 74 20   /* Cursors not 
108d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e  available for an
108e0 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45  y purpose */.  E
108f0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10900 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
10910 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10920 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
10930 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
10940 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
10950 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
10960 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10970 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
10980 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69  ZATION.  const i
10990 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
109a0 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
109b0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
109c0 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
109d0 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
109e0 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20  Bitmask maskSrc 
109f0 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
10a00 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20  MaskSet, iCur); 
10a10 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20   /* Bitmask for 
10a20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54  pSrc */.  WhereT
10a30 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45  erm * const pWCE
10a40 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
10a50 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20  ->nTerm];       
10a60 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
10a70 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
10a80 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
10a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10aa0 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
10ab0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10ac0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 52 2d  */..  /* The OR-
10ad0 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a 61 74  clause optimizat
10ae0 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ion is disallowe
10af0 64 20 69 66 20 74 68 65 20 49 4e 44 45 58 45 44  d if the INDEXED
10b00 20 42 59 20 6f 72 0a 20 20 2a 2a 20 4e 4f 54 20   BY or.  ** NOT 
10b10 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73 20  INDEXED clauses 
10b20 61 72 65 20 75 73 65 64 20 6f 72 20 69 66 20 74  are used or if t
10b30 68 65 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c  he WHERE_AND_ONL
10b40 59 20 62 69 74 20 69 73 20 73 65 74 2e 20 2a 2f  Y bit is set. */
10b50 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74  .  if( pSrc->not
10b60 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63 2d  Indexed || pSrc-
10b70 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20  >pIndex!=0 ){.  
10b80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10b90 69 66 28 20 70 57 43 2d 3e 77 63 74 72 6c 46 6c  if( pWC->wctrlFl
10ba0 61 67 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f  ags & WHERE_AND_
10bb0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 72 65 74 75  ONLY ){.    retu
10bc0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rn;.  }..  /* Se
10bd0 61 72 63 68 20 74 68 65 20 57 48 45 52 45 20 63  arch the WHERE c
10be0 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 20  lause terms for 
10bf0 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74  a usable WO_OR t
10c00 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54  erm. */.  for(pT
10c10 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72  erm=pWC->a; pTer
10c20 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b  m<pWCEnd; pTerm+
10c30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
10c40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
10c50 5f 4f 52 20 0a 20 20 20 20 20 26 26 20 28 28 70  _OR .     && ((p
10c60 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
10c70 26 20 7e 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f  & ~maskSrc) & no
10c80 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
10c90 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  && (pTerm->u.pOr
10ca0 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20  Info->indexable 
10cb0 26 20 6d 61 73 6b 53 72 63 29 21 3d 30 20 0a 20  & maskSrc)!=0 . 
10cc0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
10cd0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
10ce0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
10cf0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
10d00 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
10d10 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
10d20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
10d30 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
10d40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
10d50 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  erm;.      int f
10d60 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
10d70 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75  TI_OR;.      dou
10d80 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a  ble rTotal = 0;.
10d90 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f        double nRo
10da0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 42 69 74  w = 0;.      Bit
10db0 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
10dc0 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65 72        for(pOrTer
10dd0 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54  m=pOrWC->a; pOrT
10de0 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f  erm<pOrWCEnd; pO
10df0 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
10e00 20 20 57 68 65 72 65 43 6f 73 74 20 73 54 65 72    WhereCost sTer
10e10 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 57  mCost;.        W
10e20 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10e30 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 74  Multi-index OR t
10e40 65 73 74 69 6e 67 20 66 6f 72 20 74 65 72 6d 20  esting for term 
10e50 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c  %d of %d....\n",
10e60 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4f 72   .          (pOr
10e70 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29  Term - pOrWC->a)
10e80 2c 20 28 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e  , (pTerm - pWC->
10e90 61 29 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20  a).        ));. 
10ea0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
10eb0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
10ec0 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
10ed0 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
10ee0 70 41 6e 64 57 43 20 3d 20 26 70 4f 72 54 65 72  pAndWC = &pOrTer
10ef0 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
10f00 63 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  c;.          bes
10f10 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  tIndex(pParse, p
10f20 41 6e 64 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  AndWC, pSrc, not
10f30 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
10f40 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29 3b   0, &sTermCost);
10f50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10f60 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
10f70 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
10f80 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
10f90 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
10fa0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
10fb0 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
10fc0 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 74  rse;.          t
10fd0 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d  empWC.pMaskSet =
10fe0 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a   pWC->pMaskSet;.
10ff0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
11000 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
11010 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
11020 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
11030 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20         tempWC.a 
11040 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20  = pOrTerm;.     
11050 20 20 20 20 20 74 65 6d 70 57 43 2e 77 63 74 72       tempWC.wctr
11060 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  lFlags = 0;.    
11070 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65        tempWC.nTe
11080 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
11090 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72    bestIndex(pPar
110a0 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53 72  se, &tempWC, pSr
110b0 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74  c, notReady, not
110c0 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65 72 6d  Valid, 0, &sTerm
110d0 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
110e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
110f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11100 20 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74    }.        rTot
11110 61 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e  al += sTermCost.
11120 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  rCost;.        n
11130 52 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74  Row += sTermCost
11140 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20  .plan.nRow;.    
11150 20 20 20 20 75 73 65 64 20 7c 3d 20 73 54 65 72      used |= sTer
11160 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20 20 20  mCost.used;.    
11170 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d      if( rTotal>=
11180 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 20 62  pCost->rCost ) b
11190 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
111a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
111b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
111c0 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65  clause, increase
111d0 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74 20 74   the scan cost t
111e0 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20 20 20  o account .     
111f0 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 73 74   ** for the cost
11200 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f   of the sort. */
11210 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
11220 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy!=0 ){.      
11230 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
11240 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
11250 61 73 65 73 20 4f 52 20 63 6f 73 74 20 25 2e 39  ases OR cost %.9
11260 67 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20  g to %.9g\n",.  
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 72 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c    rTotal, rTotal
11290 2b 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f  +nRow*estLog(nRo
112a0 77 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 54  w)));.        rT
112b0 6f 74 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  otal += nRow*est
112c0 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20  Log(nRow);.     
112d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
112e0 74 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e  the cost of scan
112f0 6e 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20  ning using this 
11300 4f 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69  OR term for opti
11310 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20  mization is.    
11320 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74    ** less than t
11330 68 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20  he current cost 
11340 73 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c  stored in pCost,
11350 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   replace the con
11360 74 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  tents.      ** o
11370 66 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20  f pCost. */.    
11380 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
11390 2e 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. multi-index O
113a0 52 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77  R cost=%.9g nrow
113b0 3d 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c  =%.9g\n", rTotal
113c0 2c 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  , nRow));.      
113d0 69 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74  if( rTotal<pCost
113e0 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  ->rCost ){.     
113f0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
11400 3d 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = rTotal;.      
11410 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20    pCost->used = 
11420 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 70 43  used;.        pC
11430 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
11440 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70   nRow;.        p
11450 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
11460 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs = flags;.    
11470 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
11480 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b  u.pTerm = pTerm;
11490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
114a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
114b0 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
114c0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23  MIZATION */.}..#
114d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
114e0 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
114f0 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  EX./*.** Return 
11500 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45 52  TRUE if the WHER
11510 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 54  E clause term pT
11520 65 72 6d 20 69 73 20 6f 66 20 61 20 66 6f 72 6d  erm is of a form
11530 20 77 68 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75   where it.** cou
11540 6c 64 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ld be used with 
11550 61 6e 20 69 6e 64 65 78 20 74 6f 20 61 63 63 65  an index to acce
11560 73 73 20 70 53 72 63 2c 20 61 73 73 75 6d 69 6e  ss pSrc, assumin
11570 67 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  g an appropriate
11580 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69 73 74 65  .** index existe
11590 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
115a0 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
115b0 65 78 28 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ex(.  WhereTerm 
115c0 2a 70 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *pTerm,         
115d0 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
115e0 61 75 73 65 20 74 65 72 6d 20 74 6f 20 63 68 65  ause term to che
115f0 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ck */.  struct S
11600 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
11610 63 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  c,     /* Table 
11620 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
11630 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 42 69 74   access */.  Bit
11640 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
11650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11660 61 62 6c 65 73 20 69 6e 20 6f 75 74 65 72 20 6c  ables in outer l
11670 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e  oops of the join
11680 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 61 66   */.){.  char af
11690 66 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  f;.  if( pTerm->
116a0 6c 65 66 74 43 75 72 73 6f 72 21 3d 70 53 72 63  leftCursor!=pSrc
116b0 2d 3e 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ->iCursor ) retu
116c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
116d0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
116e0 5f 45 51 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  _EQ ) return 0;.
116f0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
11700 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
11710 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72  eady)!=0 ) retur
11720 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72  n 0;.  aff = pSr
11730 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  c->pTab->aCol[pT
11740 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
11750 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69  n].affinity;.  i
11760 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
11770 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d  AffinityOk(pTerm
11780 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29 20  ->pExpr, aff) ) 
11790 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
117a0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
117b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
117c0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
117d0 44 45 58 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  DEX./*.** If the
117e0 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72 20   query plan for 
117f0 70 53 72 63 20 73 70 65 63 69 66 69 65 64 20 69  pSrc specified i
11800 6e 20 70 43 6f 73 74 20 69 73 20 61 20 66 75 6c  n pCost is a ful
11810 6c 20 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l table scan.** 
11820 61 6e 64 20 69 6e 64 65 78 69 6e 67 20 69 73 20  and indexing is 
11830 61 6c 6c 6f 77 73 20 28 69 66 20 74 68 65 72 65  allows (if there
11840 20 69 73 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58   is no NOT INDEX
11850 45 44 20 63 6c 61 75 73 65 29 20 61 6e 64 20 69  ED clause) and i
11860 74 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  t.** possible to
11870 20 63 6f 6e 73 74 72 75 63 74 20 61 20 74 72 61   construct a tra
11880 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61  nsient index tha
11890 74 20 77 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20  t would perform 
118a0 62 65 74 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61  better.** than a
118b0 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
118c0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20 63   even when the c
118d0 6f 73 74 20 6f 66 20 63 6f 6e 73 74 72 75 63 74  ost of construct
118e0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
118f0 20 69 73 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61   is taken into a
11900 63 63 6f 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74  ccount, then alt
11910 65 72 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  er the query pla
11920 6e 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  n to use the.** 
11930 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e  transient index.
11940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11950 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
11960 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
11970 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11980 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
11990 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
119a0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
119b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
119c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
119d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
119e0 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
119f0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
11a00 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
11a10 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
11a20 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
11a30 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
11a40 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11a50 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
11a60 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
11a70 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
11a80 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
11a90 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64  y plan */.){.  d
11aa0 6f 75 62 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b  ouble nTableRow;
11ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
11ac0 77 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ws in the input 
11ad0 74 61 62 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c  table */.  doubl
11ae0 65 20 6c 6f 67 4e 3b 20 20 20 20 20 20 20 20 20  e logN;         
11af0 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54         /* log(nT
11b00 61 62 6c 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f  ableRow) */.  do
11b10 75 62 6c 65 20 63 6f 73 74 54 65 6d 70 49 64 78  uble costTempIdx
11b20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 70 65 72  ;         /* per
11b30 2d 71 75 65 72 79 20 63 6f 73 74 20 6f 66 20 74  -query cost of t
11b40 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
11b50 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ex */.  WhereTer
11b60 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
11b70 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11b80 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
11b90 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
11ba0 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b  ereTerm *pWCEnd;
11bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
11bc0 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a   of pWC->a[] */.
11bd0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11bf0 20 54 61 62 6c 65 20 74 68 74 20 6d 69 67 68 74   Table tht might
11c00 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a   be indexed */..
11c10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 51    if( pParse->nQ
11c20 75 65 72 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c  ueryLoop<=(doubl
11c30 65 29 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  e)1 ){.    /* Th
11c40 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
11c50 69 6e 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61  in building an a
11c60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 66  utomatic index f
11c70 6f 72 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e  or a single scan
11c80 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11c90 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61 72 73    }.  if( (pPars
11ca0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
11cb0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29  QLITE_AutoIndex)
11cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75  ==0 ){.    /* Au
11cd0 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20  tomatic indices 
11ce0 61 72 65 20 64 69 73 61 62 6c 65 64 20 61 74 20  are disabled at 
11cf0 72 75 6e 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20  run-time */.    
11d00 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
11d10 28 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  ( (pCost->plan.w
11d20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
11d30 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20  OT_FULLSCAN)!=0 
11d40 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 6c 72  ){.    /* We alr
11d50 65 61 64 79 20 68 61 76 65 20 73 6f 6d 65 20 6b  eady have some k
11d60 69 6e 64 20 6f 66 20 69 6e 64 65 78 20 69 6e 20  ind of index in 
11d70 75 73 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  use for this que
11d80 72 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ry. */.    retur
11d90 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  n;.  }.  if( pSr
11da0 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b  c->notIndexed ){
11db0 0a 20 20 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20  .    /* The NOT 
11dc0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 61  INDEXED clause a
11dd0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 51  ppears in the SQ
11de0 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  L. */.    return
11df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
11e00 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 29  ->isCorrelated )
11e10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75  {.    /* The sou
11e20 72 63 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  rce is a correla
11e30 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 20 4e  ted sub-query. N
11e40 6f 20 70 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78  o point in index
11e50 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72  ing it. */.    r
11e60 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
11e70 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 51  sert( pParse->nQ
11e80 75 65 72 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75  ueryLoop >= (dou
11e90 62 6c 65 29 31 20 29 3b 0a 20 20 70 54 61 62 6c  ble)1 );.  pTabl
11ea0 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
11eb0 20 20 6e 54 61 62 6c 65 52 6f 77 20 3d 20 70 54    nTableRow = pT
11ec0 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  able->nRowEst;. 
11ed0 20 6c 6f 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e   logN = estLog(n
11ee0 54 61 62 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73  TableRow);.  cos
11ef0 74 54 65 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67  tTempIdx = 2*log
11f00 4e 2a 28 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61  N*(nTableRow/pPa
11f10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
11f20 2b 20 31 29 3b 0a 20 20 69 66 28 20 63 6f 73 74  + 1);.  if( cost
11f30 54 65 6d 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e  TempIdx>=pCost->
11f40 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rCost ){.    /* 
11f50 54 68 65 20 63 6f 73 74 20 6f 66 20 63 72 65 61  The cost of crea
11f60 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65  ting the transie
11f70 6e 74 20 74 61 62 6c 65 20 77 6f 75 6c 64 20 62  nt table would b
11f80 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20  e greater than. 
11f90 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20     ** doing the 
11fa0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
11fb0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11fc0 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
11fd0 66 6f 72 20 61 6e 79 20 65 71 75 61 6c 69 74 79  for any equality
11fe0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d   comparison term
11ff0 20 2a 2f 0a 20 20 70 57 43 45 6e 64 20 3d 20 26   */.  pWCEnd = &
12000 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
12010 6d 5d 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  m];.  for(pTerm=
12020 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
12030 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
12040 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
12050 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
12060 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
12070 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
12080 52 41 43 45 28 28 22 61 75 74 6f 2d 69 6e 64 65  RACE(("auto-inde
12090 78 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 66  x reduces cost f
120a0 72 6f 6d 20 25 2e 31 66 20 74 6f 20 25 2e 31 66  rom %.1f to %.1f
120b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
120c0 20 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e           pCost->
120d0 72 43 6f 73 74 2c 20 63 6f 73 74 54 65 6d 70 49  rCost, costTempI
120e0 64 78 29 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  dx));.      pCos
120f0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 54  t->rCost = costT
12100 65 6d 70 49 64 78 3b 0a 20 20 20 20 20 20 70 43  empIdx;.      pC
12110 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d  ost->plan.nRow =
12120 20 6c 6f 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20   logN + 1;.     
12130 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
12140 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 54 45 4d  lags = WHERE_TEM
12150 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 70  P_INDEX;.      p
12160 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 70 54 65  Cost->used = pTe
12170 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
12180 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12190 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
121a0 23 20 64 65 66 69 6e 65 20 62 65 73 74 41 75 74  # define bestAut
121b0 6f 6d 61 74 69 63 49 6e 64 65 78 28 41 2c 42 2c  omaticIndex(A,B,
121c0 43 2c 44 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70  C,D,E)  /* no-op
121d0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   */.#endif /* SQ
121e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
121f0 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23  TIC_INDEX */...#
12200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12210 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
12220 45 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  EX./*.** Generat
12230 65 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72  e code to constr
12240 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
12250 6a 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f  ject for an auto
12260 6d 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61  matic index.** a
12270 6e 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65  nd to set up the
12280 20 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65   WhereLevel obje
12290 63 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61  ct pLevel so tha
122a0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
122b0 61 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73  ator.** makes us
122c0 65 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74  e of the automat
122d0 69 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ic index..*/.sta
122e0 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75  tic void constru
122f0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
12300 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12310 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12320 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
12330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
12340 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
12350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
12360 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
12370 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
12380 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
12390 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
123a0 74 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20  term to get the 
123b0 6e 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  next index */.  
123c0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
123d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ,           /* M
123e0 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ask of cursors t
123f0 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69  hat are not avai
12400 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  lable */.  Where
12410 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20  Level *pLevel   
12420 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
12430 6e 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a  new index here *
12440 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  /.){.  int nColu
12450 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mn;             
12460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12470 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
12480 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78  onstructed index
12490 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
124a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
124b0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
124c0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
124d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
124e0 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20  eTerm *pWCEnd;  
124f0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
12500 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20  f pWC->a[] */.  
12510 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
12520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12530 79 74 65 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  yte of memory ne
12540 65 64 65 64 20 66 6f 72 20 70 49 64 78 20 2a 2f  eded for pIdx */
12550 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12570 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62  * Object describ
12580 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ing the transien
12590 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  t index */.  Vdb
125a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
125b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
125c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
125d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
125e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
125f0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
12600 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12610 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
12620 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
12630 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
12640 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
12650 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
12660 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
12670 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e   KeyInfo *pKeyin
12680 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
12690 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
126a0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
126b0 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f     .  int addrTo
126c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
126d0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
126e0 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
126f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
12700 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
12710 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
12720 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
12730 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
12760 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12770 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12780 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
12790 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
127a0 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
127b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
127c0 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
127d0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
127e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
127f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12800 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
12810 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
12820 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  mn */.  Bitmask 
12830 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
12840 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
12850 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
12860 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
12870 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
12880 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
12890 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
128a0 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  nal columns */..
128b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
128c0 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
128d0 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
128e0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
128f0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
12900 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
12910 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
12920 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
12930 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
12940 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12950 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12960 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d   );.  addrInit =
12970 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
12980 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
12990 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
129a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
129b0 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
129c0 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
129d0 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
129e0 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
129f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
12a00 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
12a10 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
12a20 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
12a30 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
12a40 72 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  rm];.  idxCols =
12a50 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
12a60 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
12a70 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
12a80 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
12a90 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
12aa0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
12ab0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
12ac0 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
12ad0 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
12ae0 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
12af0 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69  iCol>=BMS ? ((Bi
12b00 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31  tmask)1)<<(BMS-1
12b10 29 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29  ) : ((Bitmask)1)
12b20 3c 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  <<iCol;.      te
12b30 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
12b40 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
12b50 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
12b60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
12b70 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
12b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43  =0 ){.        nC
12b90 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
12ba0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
12bb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
12bc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
12bd0 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c  Column>0 );.  pL
12be0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d  evel->plan.nEq =
12bf0 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20   nColumn;..  /* 
12c00 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
12c10 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
12c20 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
12c30 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
12c40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
12c50 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
12c60 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
12c70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
12c80 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
12c90 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
12ca0 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
12cb0 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
12cc0 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
12cd0 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
12ce0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
12cf0 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
12d00 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
12d10 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
12d20 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
12d30 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
12d40 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
12d50 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
12d60 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
12d70 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
12d80 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
12d90 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
12da0 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
12db0 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
12dc0 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
12dd0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
12de0 69 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74  idxCols | (((Bit
12df0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
12e00 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
12e10 20 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e   (pTable->nCol >
12e20 3d 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31  = BMS-1) ? BMS-1
12e30 20 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   : pTable->nCol;
12e40 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
12e50 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  ble->nCol==BMS-1
12e60 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
12e70 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d  pTable->nCol==BM
12e80 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  S-2 );.  for(i=0
12e90 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
12ea0 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
12eb0 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61  aCols & (((Bitma
12ec0 73 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c  sk)1)<<i) ) nCol
12ed0 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  umn++;.  }.  if(
12ee0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
12ef0 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
12f00 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
12f10 6e 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c  nColumn += pTabl
12f20 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20  e->nCol - BMS + 
12f30 31 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d  1;.  }.  pLevel-
12f40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
12f50 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
12f60 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
12f70 59 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a  Y | WO_EQ;..  /*
12f80 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
12f90 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
12fa0 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
12fb0 65 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  ex */.  nByte = 
12fc0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20  sizeof(Index);. 
12fd0 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
12fe0 6e 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20  n*sizeof(int);  
12ff0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
13000 6c 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20  lumn */.  nByte 
13010 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
13020 66 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49  f(char*);   /* I
13030 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20  ndex.azColl */. 
13040 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d   nByte += nColum
13050 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
13060 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
13070 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78  tOrder */.  pIdx
13080 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
13090 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
130a0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
130b0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
130c0 6e 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  n;.  pLevel->pla
130d0 6e 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  n.u.pIdx = pIdx;
130e0 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
130f0 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b  = (char**)&pIdx[
13100 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  1];.  pIdx->aiCo
13110 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
13120 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75  dx->azColl[nColu
13130 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn];.  pIdx->aSo
13140 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
13150 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
13160 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d  Column];.  pIdx-
13170 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69  >zName = "auto-i
13180 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e  ndex";.  pIdx->n
13190 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e  Column = nColumn
131a0 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ;.  pIdx->pTable
131b0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d   = pTable;.  n =
131c0 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20   0;.  idxCols = 
131d0 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
131e0 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
131f0 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
13200 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
13210 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
13220 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
13230 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
13240 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
13250 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
13260 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
13270 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
13280 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
13290 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
132a0 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28  <iCol;.      if(
132b0 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73   (idxCols & cMas
132c0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
132d0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
132e0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
132f0 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
13300 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  sk;.        pIdx
13310 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
13320 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13330 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  umn;.        pCo
13340 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
13350 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
13360 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
13370 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
13380 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
13390 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59  zColl[n] = ALWAY
133a0 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c  S(pColl) ? pColl
133b0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52  ->zName : "BINAR
133c0 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  Y";.        n++;
133d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
133e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33   }.  assert( (u3
133f0 32 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61  2)n==pLevel->pla
13400 6e 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41  n.nEq );..  /* A
13410 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  dd additional co
13420 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
13430 6d 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74  make the automat
13440 69 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20  ic index into.  
13450 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  ** a covering in
13460 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  dex */.  for(i=0
13470 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b  ; i<mxBitCol; i+
13480 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72  +){.    if( extr
13490 61 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61  aCols & (((Bitma
134a0 73 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20  sk)1)<<i) ){.   
134b0 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
134c0 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[n] = i;.      
134d0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
134e0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
134f0 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
13500 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
13510 55 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73  Used & (((Bitmas
13520 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29  k)1)<<(BMS-1)) )
13530 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
13540 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
13550 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
13560 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
13570 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
13580 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
13590 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
135a0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
135b0 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d  ssert( n==nColum
135c0 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n );..  /* Creat
135d0 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
135e0 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69  index */.  pKeyi
135f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
13600 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
13610 2c 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72  , pIdx);.  asser
13620 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
13630 75 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ur>=0 );.  sqlit
13640 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13650 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
13660 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
13670 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c  r, nColumn+1, 0,
13680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13690 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
136a0 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  info, P4_KEYINFO
136b0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62  _HANDOFF);.  Vdb
136c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f  eComment((v, "fo
136d0 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  r %s", pTable->z
136e0 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69  Name));..  /* Fi
136f0 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ll the automatic
13700 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74   index with cont
13710 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  ent */.  addrTop
13720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13730 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
13740 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  d, pLevel->iTabC
13750 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  ur);.  regRecord
13760 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13770 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
13780 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
13790 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
137a0 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54  pIdx, pLevel->iT
137b0 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64  abCur, regRecord
137c0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
137d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
137e0 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65  IdxInsert, pLeve
137f0 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52  l->iIdxCur, regR
13800 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
13810 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
13820 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
13830 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65  ESULT);.  sqlite
13840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13850 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e  P_Next, pLevel->
13860 69 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70  iTabCur, addrTop
13870 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
13880 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
13890 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
138a0 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71  AUTOINDEX);.  sq
138b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
138c0 65 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  e(v, addrTop);. 
138d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
138e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
138f0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20  egRecord);.  .  
13900 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65  /* Jump here whe
13910 6e 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  n skipping the i
13920 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
13930 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
13940 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
13950 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  it);.}.#endif /*
13960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13970 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
13980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13990 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
139a0 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
139b0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
139c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
139d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
139e0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
139f0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
13a00 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
13a10 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
13a20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
13a30 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
13a40 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
13a50 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
13a60 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
13a70 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
13a80 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13a90 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
13aa0 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
13ab0 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43  Parse, .  WhereC
13ac0 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74  lause *pWC,.  st
13ad0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13ae0 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
13af0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
13b00 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
13b10 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
13b20 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
13b30 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
13b40 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
13b50 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
13b60 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
13b70 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
13b80 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13b90 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
13ba0 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
13bb0 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
13bc0 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
13bd0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
13be0 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52  IdxInfo;..  WHER
13bf0 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
13c00 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
13c10 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53  for %s...\n", pS
13c20 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
13c30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
13c40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
13c50 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
13c60 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
13c70 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
13c80 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
13c90 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
13ca0 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
13cb0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
13cc0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
13cd0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
13ce0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
13cf0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
13d00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
13d10 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f  sert( (pTerm->eO
13d20 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e  perator&(pTerm->
13d30 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30  eOperator-1))==0
13d40 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
13d50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13d60 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  or==WO_IN );.   
13d70 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
13d80 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13d90 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
13da0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13db0 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
13dc0 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
13dd0 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
13de0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
13df0 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
13e00 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
13e10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13e20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13e30 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
13e40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
13e50 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
13e60 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
13e70 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
13e80 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
13e90 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
13ea0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13eb0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
13ec0 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
13ed0 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
13ee0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
13ef0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
13f00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13f10 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
13f20 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
13f30 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
13f40 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
13f50 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
13f60 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
13f70 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
13f80 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f   }.    if( i==pO
13f90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
13fa0 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
13fb0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
13fc0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
13fd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
13fe0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
13ff0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
14000 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
14010 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
14020 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
14030 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
14040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14050 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
14060 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
14070 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
14080 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
140b0 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
140c0 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
140d0 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
140e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
140f0 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
14100 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f   memory");.    /
14110 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
14120 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
14130 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
14140 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  T... */.    retu
14150 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
14160 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
14170 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
14180 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14190 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
141a0 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
141b0 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
141c0 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
141d0 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
141e0 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
141f0 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
14200 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
14210 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
14220 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
14230 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
14240 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
14250 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
14260 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14270 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
14280 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
14290 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
142a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
142b0 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
142c0 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
142d0 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
142e0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
142f0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
14300 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
14310 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
14320 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
14330 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
14340 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
14350 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
14360 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
14370 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14380 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
14390 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
143a0 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
143b0 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
143c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
143d0 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
143e0 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
143f0 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
14400 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14410 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14420 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
14430 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14440 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
14490 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
144a0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
144b0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
144c0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
144d0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
144e0 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
144f0 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
14500 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
14510 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
14520 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
14530 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  ))==0 );.    tes
14540 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
14550 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
14560 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
14570 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14580 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
14590 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
145a0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
145b0 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
145c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
145d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
145e0 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
145f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
14600 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
14610 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
14620 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
14630 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
14640 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78  et = i;.    pIdx
14650 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
14660 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
14670 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  r;.    /* The di
14680 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
14690 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
146a0 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
146b0 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
146c0 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
146d0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
146e0 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
146f0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
14700 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
14710 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
14720 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
14730 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
14740 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
14750 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
14760 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14770 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
14780 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
14790 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
147a0 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
147b0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
147c0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
147d0 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
147e0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
147f0 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
14800 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
14810 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14820 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
14830 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
14840 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
14850 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
14860 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
14870 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
14880 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
14890 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
148a0 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
148b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
148c0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
148d0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
148e0 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
148f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
14900 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
14910 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
14920 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
14930 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
14940 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14950 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
14960 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
14970 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
14980 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
14990 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
149a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
149b0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
149c0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
149d0 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
149e0 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
149f0 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
14a00 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
14a10 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
14a20 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
14a30 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
14a40 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e  _index_info poin
14a50 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
14a60 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
14a70 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
14a80 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
14a90 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
14aa0 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
14ab0 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
14ac0 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
14ad0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
14ae0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
14af0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
14b00 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
14b10 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14b20 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
14b30 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
14b40 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
14b50 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
14b60 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
14b70 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
14b80 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
14b90 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14ba0 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
14bb0 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
14bc0 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
14bd0 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
14be0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
14bf0 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
14c00 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
14c10 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
14c20 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
14c30 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
14c40 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
14c50 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
14c60 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
14c70 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
14c80 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
14c90 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
14ca0 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
14cb0 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
14cc0 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49  ame));.  TRACE_I
14cd0 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
14ce0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
14cf0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
14d00 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
14d10 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
14d20 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
14d30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
14d50 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
14d60 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
14d70 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
14d80 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
14d90 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
14da0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14db0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
14dc0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
14dd0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
14de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14df0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
14e00 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
14e10 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
14e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
14e30 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
14e40 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
14e50 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
14e60 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
14e70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14e80 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
14e90 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
14ea0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14eb0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
14ec0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14ed0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14ee0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
14ef0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
14f00 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
14f10 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
14f20 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
14f30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
14f40 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a  Parse->nErr;.}..
14f50 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
14f60 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
14f70 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
14f80 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
14f90 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
14fa0 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
14fb0 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
14fc0 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
14fd0 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
14fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
14ff0 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
15000 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
15010 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
15020 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15030 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
15040 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
15050 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
15060 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
15070 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
15080 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
15090 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
150a0 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
150b0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
150c0 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
150d0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
150e0 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
150f0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
15100 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
15110 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
15120 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
15130 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
15140 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
15150 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
15160 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
15170 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
15180 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
15190 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
151a0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
151b0 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
151c0 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
151d0 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
151e0 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
151f0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
15200 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
15210 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
15220 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
15230 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
15240 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a  stVirtualIndex(.
15250 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
15280 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
15290 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
152b0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
152c0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
152d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
152e0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
152f0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
15300 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
15310 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15330 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
15340 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
15350 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69  or index */.  Bi
15360 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20  tmask notValid, 
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15380 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c   Cursors not val
15390 69 64 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  id for any purpo
153a0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
153b0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
153c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
153d0 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a  rder by clause *
153e0 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
153f0 43 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Cost,           
15400 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f      /* Lowest co
15410 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  st query plan */
15420 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
15430 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
15440 6f 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f  o  /* Index info
15450 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74  rmation passed t
15460 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  o xBestIndex */.
15470 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
15480 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
15490 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
154a0 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
154b0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
154c0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
154d0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
154e0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
154f0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
15500 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
15510 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
15520 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
15530 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64  nt nOrderBy;.  d
15540 6f 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20  ouble rCost;..  
15550 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46  /* Make sure wsF
15560 6c 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69  lags is initiali
15570 7a 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65  zed to some sane
15580 20 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73   value. Otherwis
15590 65 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20  e, if the .  ** 
155a0 6d 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61  malloc in alloca
155b0 74 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61  teIndexInfo() fa
155c0 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ils and this fun
155d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65  ction returns le
155e0 61 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61  aving.  ** wsFla
155f0 67 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69  gs in an uniniti
15600 61 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68  alized state, th
15610 65 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68  e caller may beh
15620 61 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c  ave unpredictabl
15630 79 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  y..  */.  memset
15640 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  (pCost, 0, sizeo
15650 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43  f(*pCost));.  pC
15660 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
15670 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
15680 4c 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66  LTABLE;..  /* If
15690 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
156a0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
156b0 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
156c0 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
156d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
156e0 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61  tialized, then a
156f0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
15700 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20  ialize it now.. 
15710 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
15720 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69   *ppIdxInfo;.  i
15730 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
15740 7b 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f  {.    *ppIdxInfo
15750 20 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c   = pIdxInfo = al
15760 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28  locateIndexInfo(
15770 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72  pParse, pWC, pSr
15780 63 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  c, pOrderBy);.  
15790 7d 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  }.  if( pIdxInfo
157a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
157b0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  n;.  }..  /* At 
157c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
157d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
157e0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
157f0 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
15800 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
15810 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
15820 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
15830 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
15840 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
15850 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
15860 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
15870 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
15880 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
15890 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
158a0 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
158b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
158c0 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
158d0 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
158e0 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
158f0 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
15900 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
15910 65 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69  ed. Also, by thi
15920 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75  s point there mu
15930 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69  st.  ** be a poi
15940 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
15950 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
15960 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a  e. Otherwise.  *
15970 2a 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  * sqlite3ViewGet
15980 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f  ColumnNames() wo
15990 75 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20  uld have picked 
159a0 75 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20  up the error. . 
159b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
159c0 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20  ab->azModuleArg 
159d0 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  && pTab->azModul
159e0 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73  eArg[0] );.  ass
159f0 65 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56  ert( sqlite3GetV
15a00 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
15a10 2c 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a  , pTab) );..  /*
15a20 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72   Set the aConstr
15a30 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69  aint[].usable fi
15a40 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  elds and initial
15a50 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75  ize all .  ** ou
15a60 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
15a70 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
15a80 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  * aConstraint[].
15a90 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20 66  usable is true f
15aa0 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  or constraints w
15ab0 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68  here the right-h
15ac0 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f  and.  ** side co
15ad0 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65  ntains only refe
15ae0 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73  rences to tables
15af0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
15b00 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
15b10 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
15b20 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
15b30 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66  constraint is of
15b40 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
15b50 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63    **           c
15b60 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a  olumn = expr.  *
15b70 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72  *.  ** and we ar
15b80 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a  e evaluating a j
15b90 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  oin, then the co
15ba0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75  nstraint on colu
15bb0 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79  mn is .  ** only
15bc0 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61   valid if all ta
15bd0 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
15be0 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f  in expr occur to
15bf0 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f   the left.  ** o
15c00 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  f the table cont
15c10 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20  aining column.. 
15c20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f   **.  ** The aCo
15c30 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61  nstraints[] arra
15c40 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  y contains entri
15c50 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
15c60 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74  raints.  ** on t
15c70 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15c80 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20 6f  .  That way we o
15c90 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70  nly have to comp
15ca0 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a  ute it once.  **
15cb0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20   even though we 
15cc0 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69 63  might try to pic
15cd0 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  k the best index
15ce0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e   multiple times.
15cf0 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61  .  ** For each a
15d00 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e  ttempt at pickin
15d10 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20  g an index, the 
15d20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
15d30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e  in the.  ** join
15d40 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
15d50 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20 74  ent so we have t
15d60 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20  o recompute the 
15d70 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a  usable flag.  **
15d80 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f   each time..  */
15d90 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28  .  pIdxCons = *(
15da0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
15db0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
15dc0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
15dd0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61  nstraint;.  pUsa
15de0 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
15df0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
15e00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
15e10 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
15e20 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f  int; i++, pIdxCo
15e30 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70  ns++){.    j = p
15e40 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66  IdxCons->iTermOf
15e50 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20  fset;.    pTerm 
15e60 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
15e70 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
15e80 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65  le = (pTerm->pre
15e90 72 65 71 52 69 67 68 74 26 6e 6f 74 52 65 61 64  reqRight&notRead
15ea0 79 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a  y) ? 0 : 1;.  }.
15eb0 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
15ec0 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
15ed0 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
15ee0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
15ef0 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
15f00 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
15f10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
15f20 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  ee(pIdxInfo->idx
15f30 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78  Str);.  }.  pIdx
15f40 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30  Info->idxStr = 0
15f50 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ;.  pIdxInfo->id
15f60 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78  xNum = 0;.  pIdx
15f70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
15f80 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49  IdxStr = 0;.  pI
15f90 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
15fa0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f  onsumed = 0;.  /
15fb0 2a 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e  * ((double)2) In
15fc0 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
15fd0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
15fe0 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78  INT... */.  pIdx
15ff0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
16000 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
16010 5f 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29  _DBL / ((double)
16020 32 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d  2);.  nOrderBy =
16030 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
16040 72 42 79 3b 0a 20 20 69 66 28 20 21 70 4f 72 64  rBy;.  if( !pOrd
16050 65 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78  erBy ){.    pIdx
16060 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
16070 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76   0;.  }..  if( v
16080 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
16090 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
160a0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nfo) ){.    retu
160b0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43  rn;.  }..  pIdxC
160c0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
160d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
160e0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
160f0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
16100 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16110 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
16120 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
16130 69 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  if( pUsage[i].ar
16140 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
16150 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c     pCost->used |
16160 3d 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e  = pWC->a[pIdxCon
16170 73 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[i].iTermOffset
16180 5d 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ].prereqRight;. 
16190 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
161a0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
161b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61  DER BY clause, a
161c0 6e 64 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  nd the selected 
161d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
161e0 64 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  dex.  ** does no
161f0 74 20 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e  t satisfy it, in
16200 63 72 65 61 73 65 20 74 68 65 20 63 6f 73 74 20  crease the cost 
16210 6f 66 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f  of the scan acco
16220 72 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20  rdingly. This.  
16230 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  ** matches the p
16240 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f  rocessing for no
16250 6e 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n-virtual tables
16260 20 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64   in bestBtreeInd
16270 65 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f  ex()..  */.  rCo
16280 73 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65  st = pIdxInfo->e
16290 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20  stimatedCost;.  
162a0 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
162b0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
162c0 79 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a  yConsumed==0 ){.
162d0 20 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74      rCost += est
162e0 4c 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74  Log(rCost)*rCost
162f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
16300 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  cost is not allo
16310 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72  wed to be larger
16320 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47   than SQLITE_BIG
16330 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69  _DBL (the.  ** i
16340 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c  nital value of l
16350 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69  owestCost in thi
16360 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73  s loop. If it is
16370 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
16380 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74  (cost<lowestCost
16390 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c  ) test below wil
163a0 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e  l never be true.
163b0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20  .  ** .  ** Use 
163c0 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74  "(double)2" inst
163d0 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20  ead of "2.0" in 
163e0 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49  case OMIT_FLOATI
163f0 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69  NG_POINT .  ** i
16400 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a  s defined..  */.
16410 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49    if( (SQLITE_BI
16420 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
16430 29 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20  ))<rCost ){.    
16440 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28  pCost->rCost = (
16450 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28  SQLITE_BIG_DBL/(
16460 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d  (double)2));.  }
16470 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d  else{.    pCost-
16480 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a  >rCost = rCost;.
16490 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61    }.  pCost->pla
164a0 6e 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70  n.u.pVtabIdx = p
164b0 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
164c0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
164d0 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
164e0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
164f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
16500 45 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73  ERBY;.  }.  pCos
16510 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b  t->plan.nEq = 0;
16520 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  .  pIdxInfo->nOr
16530 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
16540 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  ;..  /* Try to f
16550 69 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63  ind a more effic
16560 69 65 6e 74 20 61 63 63 65 73 73 20 70 61 74 74  ient access patt
16570 65 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c  ern by using mul
16580 74 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20  tiple indexes.  
16590 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
165a0 6e 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20  n OR expression 
165b0 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45  within the WHERE
165c0 20 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20   clause. .  */. 
165d0 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
165e0 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
165f0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
16600 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
16610 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65  By, pCost);.}.#e
16620 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16630 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16640 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16650 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
16660 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
16670 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61  he location of a
16680 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20   particular key 
16690 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69  among all keys i
166a0 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  n an.** index.  
166b0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
166c0 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f  s in aStat as fo
166d0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
166e0 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73  aStat[0]      Es
166f0 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
16700 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c  s less than pVal
16710 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20  .**    aStat[1] 
16720 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72       Est. number
16730 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74   of rows equal t
16740 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74  o pVal.**.** Ret
16750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16760 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
16770 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
16780 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
16790 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
167a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
167b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
167c0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167e0 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
167f0 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
16800 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16810 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
16820 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
16830 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
16840 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
16850 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
16860 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
16870 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
16880 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
168a0 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
168b0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
168c0 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49 6e   tRowcnt n;.  In
168d0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
168e0 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54 79  le;.  int i, eTy
168f0 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20 3d  pe;.  int isEq =
16900 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 64   0;.  i64 v;.  d
16910 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20 20  ouble r, rS;..  
16920 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
16930 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
16940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
16950 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
16960 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29  .  if( pVal==0 )
16970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16980 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64 78  RROR;.  n = pIdx
16990 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
169a0 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d   aSample = pIdx-
169b0 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79 70  >aSample;.  eTyp
169c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
169d0 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20  e_type(pVal);.. 
169e0 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49   if( eType==SQLI
169f0 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
16a00 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    v = sqlite3_va
16a10 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b  lue_int64(pVal);
16a20 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76 3b  .    r = (i64)v;
16a30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16a40 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69  pIdx->nSample; i
16a50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
16a60 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
16a70 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
16a80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
16a90 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54  f( aSample[i].eT
16aa0 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype>=SQLITE_TEXT
16ab0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
16ac0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16ad0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Type==SQLITE_INT
16ae0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
16af0 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
16b00 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20 20  .i>=v ){.       
16b10 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16b20 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20 20  e[i].u.i==v;.   
16b30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16b50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
16b60 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ert( aSample[i].
16b70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
16b80 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69  OAT );.        i
16b90 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e  f( aSample[i].u.
16ba0 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=r ){.        
16bb0 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c 65    isEq = aSample
16bc0 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20 20  [i].u.r==r;.    
16bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16bf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16c00 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46   eType==SQLITE_F
16c10 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOAT ){.    r = 
16c20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
16c30 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  uble(pVal);.    
16c40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
16c50 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
16c60 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c        if( aSampl
16c70 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49  e[i].eType==SQLI
16c80 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  TE_NULL ) contin
16c90 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  ue;.      if( aS
16ca0 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d  ample[i].eType>=
16cb0 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72  SQLITE_TEXT ) br
16cc0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
16cd0 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
16ce0 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
16cf0 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61 53  .        rS = aS
16d00 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20 20  ample[i].u.r;.  
16d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65 5b     rS = aSample[
16d30 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  i].u.i;.      }.
16d40 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72 20        if( rS>=r 
16d50 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71 20  ){.        isEq 
16d60 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20 20  = rS==r;.       
16d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16d80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16d90 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
16da0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20  NULL ){.    i = 
16db0 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d 70  0;.    if( aSamp
16dc0 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[0].eType==SQL
16dd0 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71 20  ITE_NULL ) isEq 
16de0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
16df0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16e00 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
16e10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16e20 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OB );.    for(i=
16e30 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  0; i<pIdx->nSamp
16e40 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
16e50 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16e60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
16e70 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  T || aSample[i].
16e80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
16e90 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  OB ){.        br
16ea0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16eb0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64   }.    if( i<pId
16ec0 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20 20  x->nSample ){   
16ed0 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65     .      sqlite
16ee0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16ef0 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
16f00 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
16f10 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
16f20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
16f30 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
16f40 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20       z = (const 
16f50 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  u8 *)sqlite3_val
16f60 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20  ue_blob(pVal);. 
16f70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
16f80 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
16f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
16fa0 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  oll->enc==SQLITE
16fb0 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d  _UTF8 );.      }
16fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
16fd0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
16fe0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
16ff0 54 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64  TE_UTF8, 0, *pId
17000 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  x->azColl);.    
17010 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
17020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
17030 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17040 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
17050 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17060 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  e: %s",.        
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29    *pIdx->azColl)
17090 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
170a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
170b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
170c0 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38     z = (const u8
170d0 20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54   *)sqlite3ValueT
170e0 65 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d  ext(pVal, pColl-
170f0 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69  >enc);.        i
17100 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20  f( !z ){.       
17110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
17130 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
17140 28 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20  ( z && pColl && 
17150 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20  pColl->xCmp );. 
17160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d       }.      n =
17170 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74   sqlite3ValueByt
17180 65 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e  es(pVal, pColl->
17190 65 6e 63 29 3b 0a 20 20 0a 20 20 20 20 20 20 66  enc);.  .      f
171a0 6f 72 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61  or(; i<pIdx->nSa
171b0 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
171c0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
171d0 20 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79     int eSamplety
171e0 70 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  pe = aSample[i].
171f0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69  eType;.        i
17200 66 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65  f( eSampletype<e
17210 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Type ) continue;
17220 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 53 61  .        if( eSa
17230 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70 65 20  mpletype!=eType 
17240 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66  ) break;.#ifndef
17250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17260 31 36 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  16.        if( p
17270 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54  Coll->enc!=SQLIT
17280 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20  E_UTF8 ){.      
17290 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b      int nSample;
172a0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
172b0 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74  *zSample = sqlit
172c0 65 33 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20  e3Utf8to16(.    
172d0 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 70 43            db, pC
172e0 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c  oll->enc, aSampl
172f0 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c  e[i].u.z, aSampl
17300 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61  e[i].nByte, &nSa
17310 6d 70 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29  mple.          )
17320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17330 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  !zSample ){.    
17340 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17350 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17360 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
17380 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
17390 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
173a0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
173b0 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65  ->pUser, nSample
173c0 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29  , zSample, n, z)
173d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
173e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
173f0 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  ample);.        
17400 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
17410 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
17420 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70   c = pColl->xCmp
17430 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61  (pColl->pUser, a
17440 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c  Sample[i].nByte,
17450 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c   aSample[i].u.z,
17460 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   n, z);.        
17470 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3e  }.        if( c>
17480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17490 69 66 28 20 63 3d 3d 30 20 29 20 69 73 45 71 20  if( c==0 ) isEq 
174a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
174b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
174c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
174d0 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
174e0 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69  point, aSample[i
174f0 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  ] is the first s
17500 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
17510 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20  eater than.  ** 
17520 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c  or equal to pVal
17530 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78  .  Or if i==pIdx
17540 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ->nSample, then 
17550 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  all samples are 
17560 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70  less.  ** than p
17570 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65  Val.  If aSample
17580 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20  [i]==pVal, then 
17590 69 73 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20  isEq==1..  */.  
175a0 69 66 28 20 69 73 45 71 20 29 7b 0a 20 20 20 20  if( isEq ){.    
175b0 61 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e  assert( i<pIdx->
175c0 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61  nSample );.    a
175d0 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
175e0 65 5b 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53  e[i].nLt;.    aS
175f0 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[1] = aSample
17600 5b 69 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65  [i].nEq;.  }else
17610 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c  {.    tRowcnt iL
17620 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47  ower, iUpper, iG
17630 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  ap;.    if( i==0
17640 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72   ){.      iLower
17650 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70   = 0;.      iUpp
17660 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  er = aSample[0].
17670 6e 4c 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nLt;.    }else{.
17680 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69        iUpper = i
17690 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
176a0 3f 20 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d  ? n : aSample[i]
176b0 2e 6e 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77  .nLt;.      iLow
176c0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31  er = aSample[i-1
176d0 5d 2e 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b  ].nEq + aSample[
176e0 69 2d 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a  i-1].nLt;.    }.
176f0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70      aStat[1] = p
17700 49 64 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20  Idx->avgEq;.    
17710 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70  if( iLower>=iUpp
17720 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  er ){.      iGap
17730 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
17740 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 55  .      iGap = iU
17750 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20  pper - iLower;. 
17760 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75     }.    if( rou
17770 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47  ndUp ){.      iG
17780 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b  ap = (iGap*2)/3;
17790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
177a0 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b    iGap = iGap/3;
177b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74  .    }.    aStat
177c0 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69  [0] = iLower + i
177d0 47 61 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Gap;.  }.  retur
177e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
177f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17800 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a  ENABLE_STAT3 */.
17810 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73  ./*.** If expres
17820 73 69 6f 6e 20 70 45 78 70 72 20 72 65 70 72 65  sion pExpr repre
17830 73 65 6e 74 73 20 61 20 6c 69 74 65 72 61 6c 20  sents a literal 
17840 76 61 6c 75 65 2c 20 73 65 74 20 2a 70 70 20 74  value, set *pp t
17850 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e  o point to.** an
17860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
17870 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
17880 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ing the same val
17890 75 65 2c 20 77 69 74 68 20 61 66 66 69 6e 69 74  ue, with affinit
178a0 79 0a 2a 2a 20 61 66 66 20 61 70 70 6c 69 65 64  y.** aff applied
178b0 20 74 6f 20 69 74 2c 20 62 65 66 6f 72 65 20 72   to it, before r
178c0 65 74 75 72 6e 69 6e 67 2e 20 49 74 20 69 73 20  eturning. It is 
178d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
178e0 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61  ty of the .** ca
178f0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
17900 6c 79 20 72 65 6c 65 61 73 65 20 74 68 69 73 20  ly release this 
17910 73 74 72 75 63 74 75 72 65 20 62 79 20 70 61 73  structure by pas
17920 73 69 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73  sing it to .** s
17930 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
17940 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
17950 63 75 72 72 65 6e 74 20 70 61 72 73 65 20 69 73  current parse is
17960 20 61 20 72 65 63 6f 6d 70 69 6c 65 20 28 73 71   a recompile (sq
17970 6c 69 74 65 33 52 65 70 72 65 70 61 72 65 28 29  lite3Reprepare()
17980 29 20 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69  ) and pExpr.** i
17990 73 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c  s an SQL variabl
179a0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
179b0 20 68 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20   has a non-NULL 
179c0 76 61 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 69  value bound to i
179d0 74 2c 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e 20  t,.** create an 
179e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
179f0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
17a00 6e 67 20 74 68 69 73 20 76 61 6c 75 65 2c 20 61  ng this value, a
17a10 67 61 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66  gain with.** aff
17a20 69 6e 69 74 79 20 61 66 66 20 61 70 70 6c 69 65  inity aff applie
17a30 64 20 74 6f 20 69 74 2c 20 69 6e 73 74 65 61 64  d to it, instead
17a40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  ..**.** If neith
17a50 65 72 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  er of the above 
17a60 61 70 70 6c 79 2c 20 73 65 74 20 2a 70 70 20 74  apply, set *pp t
17a70 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  o NULL..**.** If
17a80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17a90 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
17aa0 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
17ab0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
17ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17ad0 4e 41 42 4c 45 5f 53 54 41 54 33 0a 73 74 61 74  NABLE_STAT3.stat
17ae0 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d  ic int valueFrom
17af0 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
17b00 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
17b10 70 45 78 70 72 2c 20 0a 20 20 75 38 20 61 66 66  pExpr, .  u8 aff
17b20 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
17b30 75 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28  ue **pp.){.  if(
17b40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56   pExpr->op==TK_V
17b50 41 52 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70  ARIABLE.   || (p
17b60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
17b70 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
17b80 6f 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45  op2==TK_VARIABLE
17b90 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ).  ){.    int i
17ba0 56 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Var = pExpr->iCo
17bb0 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
17bc0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
17bd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69  pParse->pVdbe, i
17be0 56 61 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Var);.    *pp = 
17bf0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61  sqlite3VdbeGetVa
17c00 6c 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70  lue(pParse->pRep
17c10 72 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66  repare, iVar, af
17c20 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  f);.    return S
17c30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17c40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61  return sqlite3Va
17c50 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
17c60 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
17c70 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c  QLITE_UTF8, aff,
17c80 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   pp);.}.#endif..
17c90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17ca0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65  ion is used to e
17cb0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
17cc0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
17cd0 77 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a  will be visited.
17ce0 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61  ** by scanning a
17cf0 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61  n index for a ra
17d00 6e 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54  nge of values. T
17d10 68 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76  he range may hav
17d20 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f  e an upper.** bo
17d30 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75  und, a lower bou
17d40 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65  nd, or both. The
17d50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
17d60 72 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65  rms that set the
17d70 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f   upper.** and lo
17d80 77 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72  wer bounds are r
17d90 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c  epresented by pL
17da0 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
17db0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f  respectively. Fo
17dc0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73  r.** example, as
17dd0 73 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65  suming that inde
17de0 78 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a  x p is on t1(a):
17df0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
17e00 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
17e10 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
17e20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17e30 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c       |_____|   |
17e40 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20  _____|.**       
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20  |         |.**  
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70     pLower    pUp
17e90 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  per.**.** If eit
17ea0 68 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72  her of the upper
17eb0 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   or lower bound 
17ec0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
17ed0 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73  then NULL is pas
17ee0 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20  sed in.** place 
17ef0 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
17f00 64 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a  ding WhereTerm..
17f10 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61  **.** The nEq pa
17f20 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
17f30 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
17f40 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
17f50 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a  subject to the.*
17f60 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  * range constrai
17f70 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65  nt. Or, equivale
17f80 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72  ntly, the number
17f90 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   of equality con
17fa0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69  straints.** opti
17fb0 6d 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f  mized by the pro
17fc0 70 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e  posed index scan
17fd0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  . For example, a
17fe0 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20  ssuming index p 
17ff0 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62  is.** on t1(a, b
18000 29 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71  ), and the SQL q
18010 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  uery is:.**.**  
18020 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45   ... FROM t1 WHE
18030 52 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e  RE a = ? AND b >
18040 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e   ? AND b < ? ...
18050 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
18060 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
18070 20 74 68 65 20 76 61 6c 75 65 20 31 20 28 61 73   the value 1 (as
18080 20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72   the range restr
18090 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a  icted column,.**
180a0 20 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e   b, is the secon
180b0 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  d left-most colu
180c0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29  mn of the index)
180d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65  . Or, if the que
180e0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
180f0 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
18100 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
18110 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   ....**.** then 
18120 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61  nEq should be pa
18130 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  ssed 0..**.** Th
18140 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
18150 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 64   is an integer d
18160 69 76 69 73 6f 72 20 74 6f 20 72 65 64 75 63 65  ivisor to reduce
18170 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 0a 2a   the estimated.*
18180 2a 20 73 65 61 72 63 68 20 73 70 61 63 65 2e 20  * search space. 
18190 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   A return value 
181a0 6f 66 20 31 20 6d 65 61 6e 73 20 74 68 61 74 20  of 1 means that 
181b0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
181c0 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68 65 6c 70  s are.** no help
181d0 20 61 74 20 61 6c 6c 2e 20 20 41 20 72 65 74 75   at all.  A retu
181e0 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65  rn value of 2 me
181f0 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ans range constr
18200 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20 65 78 70  aints are.** exp
18210 65 63 74 65 64 20 74 6f 20 72 65 64 75 63 65 20  ected to reduce 
18220 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
18230 20 62 79 20 68 61 6c 66 2e 20 20 41 6e 64 20 73   by half.  And s
18240 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a 0a 2a 2a  o forth....**.**
18250 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
18260 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  of sqlite_stat3 
18270 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 65 61  ANALYZE data, ea
18280 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c  ch range inequal
18290 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73 20 74  ity.** reduces t
182a0 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
182b0 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
182c0 2e 20 20 48 65 6e 63 65 20 61 20 73 69 6e 67 6c  .  Hence a singl
182d0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e  e constraint (x>
182e0 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  ?).** results in
182f0 20 61 20 72 65 74 75 72 6e 20 6f 66 20 34 20 61   a return of 4 a
18300 6e 64 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74  nd a range const
18310 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78  raint (x>? AND x
18320 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  <?) results.** i
18330 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20 31 36  n a return of 16
18340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18350 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
18360 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
18370 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18380 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
18390 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
183a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
183b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
183c0 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67  index containing
183d0 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
183e0 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20  red column; "x" 
183f0 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20  */.  int nEq,   
18400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64            /* ind
18410 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b  ex into p->aCol[
18420 5d 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63  ] of the range-c
18430 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a  ompared column *
18440 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
18450 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
18460 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
18470 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
18480 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
18490 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
184a0 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
184b0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
184c0 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
184d0 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
184e0 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 52   */.  double *pR
184f0 61 6e 67 65 44 69 76 20 20 20 2f 2a 20 4f 55 54  angeDiv   /* OUT
18500 3a 20 52 65 64 75 63 65 20 73 65 61 72 63 68 20  : Reduce search 
18510 73 70 61 63 65 20 62 79 20 74 68 69 73 20 64 69  space by this di
18520 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  visor */.){.  in
18530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18540 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
18550 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 0a 20  _ENABLE_STAT3.. 
18560 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 70   if( nEq==0 && p
18570 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->nSample ){.   
18580 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18590 70 52 61 6e 67 65 56 61 6c 3b 0a 20 20 20 20 74  pRangeVal;.    t
185a0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20  Rowcnt iLower = 
185b0 30 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  0;.    tRowcnt i
185c0 55 70 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77  Upper = p->aiRow
185d0 45 73 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77  Est[0];.    tRow
185e0 63 6e 74 20 61 5b 32 5d 3b 0a 20 20 20 20 75 38  cnt a[2];.    u8
185f0 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
18600 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
18610 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
18620 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72  ..    if( pLower
18630 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
18640 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e  pExpr = pLower->
18650 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
18660 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46       rc = valueF
18670 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
18680 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 61  pExpr, aff, &pRa
18690 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 20 20 61  ngeVal);.      a
186a0 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e 65  ssert( pLower->e
186b0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 20  Operator==WO_GT 
186c0 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72  || pLower->eOper
186d0 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  ator==WO_GE );. 
186e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
186f0 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26  ITE_OK.       &&
18700 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
18710 50 61 72 73 65 2c 20 70 2c 20 70 52 61 6e 67 65  Parse, p, pRange
18720 56 61 6c 2c 20 30 2c 20 61 29 3d 3d 53 51 4c 49  Val, 0, a)==SQLI
18730 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20  TE_OK.      ){. 
18740 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
18750 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[0];.        if
18760 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61  ( pLower->eOpera
18770 74 6f 72 3d 3d 57 4f 5f 47 54 20 29 20 69 4c 6f  tor==WO_GT ) iLo
18780 77 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20  wer += a[1];.   
18790 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
187a0 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 61 6e  e3ValueFree(pRan
187b0 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  geVal);.    }.  
187c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
187d0 5f 4f 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b  _OK && pUpper ){
187e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
187f0 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78  pr = pUpper->pEx
18800 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
18810 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d    rc = valueFrom
18820 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18830 70 72 2c 20 61 66 66 2c 20 26 70 52 61 6e 67 65  pr, aff, &pRange
18840 56 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Val);.      asse
18850 72 74 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65  rt( pUpper->eOpe
18860 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20  rator==WO_LT || 
18870 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18880 72 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20  r==WO_LE );.    
18890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
188a0 5f 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68  _OK.       && wh
188b0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
188c0 73 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c  se, p, pRangeVal
188d0 2c 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f  , 1, a)==SQLITE_
188e0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
188f0 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
18900 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
18910 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
18920 3d 3d 57 4f 5f 4c 45 20 29 20 69 55 70 70 65 72  ==WO_LE ) iUpper
18930 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20   += a[1];.      
18940 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18950 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56  alueFree(pRangeV
18960 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
18970 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18980 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 55   ){.      if( iU
18990 70 70 65 72 3c 3d 69 4c 6f 77 65 72 20 29 7b 0a  pper<=iLower ){.
189a0 20 20 20 20 20 20 20 20 2a 70 52 61 6e 67 65 44          *pRangeD
189b0 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e  iv = (double)p->
189c0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
189d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189e0 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 28    *pRangeDiv = (
189f0 64 6f 75 62 6c 65 29 70 2d 3e 61 69 52 6f 77 45  double)p->aiRowE
18a00 73 74 5b 30 5d 2f 28 64 6f 75 62 6c 65 29 28 69  st[0]/(double)(i
18a10 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b  Upper - iLower);
18a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 57  .      }.      W
18a30 48 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67  HERETRACE(("rang
18a40 65 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  e scan regions: 
18a50 25 75 2e 2e 25 75 20 20 64 69 76 3d 25 67 5c 6e  %u..%u  div=%g\n
18a60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18a70 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72       (u32)iLower
18a80 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c 20 2a  , (u32)iUpper, *
18a90 70 52 61 6e 67 65 44 69 76 29 29 3b 0a 20 20 20  pRangeDiv));.   
18aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18ab0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
18ac0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
18ad0 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
18ae0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
18af0 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
18b00 5f 50 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b  _PARAMETER(nEq);
18b10 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18b20 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
18b30 65 72 20 29 3b 0a 20 20 2a 70 52 61 6e 67 65 44  er );.  *pRangeD
18b40 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a  iv = (double)1;.
18b50 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
18b60 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67 73  (pLower->wtFlags
18b70 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
18b80 30 20 29 20 2a 70 52 61 6e 67 65 44 69 76 20 2a  0 ) *pRangeDiv *
18b90 3d 20 28 64 6f 75 62 6c 65 29 34 3b 0a 20 20 69  = (double)4;.  i
18ba0 66 28 20 70 55 70 70 65 72 20 29 20 2a 70 52 61  f( pUpper ) *pRa
18bb0 6e 67 65 44 69 76 20 2a 3d 20 28 64 6f 75 62 6c  ngeDiv *= (doubl
18bc0 65 29 34 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  e)4;.  return rc
18bd0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
18be0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
18bf0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
18c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18c10 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
18c20 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
18c30 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
18c40 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
18c50 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
18c60 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
18c70 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
18c80 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
18c90 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
18ca0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
18cb0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
18cc0 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
18cd0 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
18ce0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
18cf0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
18d00 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
18d10 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
18d20 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
18d30 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
18d40 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
18d50 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
18d60 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
18d70 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
18d80 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
18d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18da0 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
18db0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
18dc0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
18dd0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
18de0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
18df0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
18e00 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
18e10 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
18e20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
18e30 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
18e40 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
18e50 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
18e60 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
18e70 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
18e80 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
18e90 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
18ea0 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
18eb0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
18ec0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
18ed0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
18ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18ef0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
18f00 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
18f10 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18f20 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
18f30 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
18f40 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
18f50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18f60 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
18f70 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
18f80 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20  pTerm */.  Expr 
18f90 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
18fa0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
18fb0 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
18fc0 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
18fd0 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70  t */.  double *p
18fe0 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57  nRow        /* W
18ff0 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
19000 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
19010 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
19020 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73 20 3d  e3_value *pRhs =
19030 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20 6f 6e   0;  /* VALUE on
19040 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
19050 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20 20 75   of pTerm */.  u
19060 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  8 aff;          
19070 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
19080 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  mn affinity */. 
19090 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
190a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
190b0 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
190c0 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
190d0 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
190e0 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
190f0 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  cs */..  assert(
19100 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
19110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
19120 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 66  Sample>0 );.  af
19130 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
19140 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
19150 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  0]].affinity;.  
19160 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
19170 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45   rc = valueFromE
19180 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
19190 72 2c 20 61 66 66 2c 20 26 70 52 68 73 29 3b 0a  r, aff, &pRhs);.
191a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
191b0 6f 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  o whereEqualScan
191c0 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65  Est_cancel;.  }e
191d0 6c 73 65 7b 0a 20 20 20 20 70 52 68 73 20 3d 20  lse{.    pRhs = 
191e0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
191f0 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
19200 0a 20 20 69 66 28 20 70 52 68 73 3d 3d 30 20 29  .  if( pRhs==0 )
19210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
19220 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20  OTFOUND;.  rc = 
19230 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
19240 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30  arse, p, pRhs, 0
19250 2c 20 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , a);.  if( rc==
19260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19270 20 57 48 45 52 45 54 52 41 43 45 28 28 22 65 71   WHERETRACE(("eq
19280 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69  uality scan regi
19290 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ons: %d\n", (int
192a0 29 61 5b 31 5d 29 29 3b 0a 20 20 20 20 2a 70 6e  )a[1]));.    *pn
192b0 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 7d 0a  Row = a[1];.  }.
192c0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
192d0 74 5f 63 61 6e 63 65 6c 3a 0a 20 20 73 71 6c 69  t_cancel:.  sqli
192e0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 68  te3ValueFree(pRh
192f0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  s);.  return rc;
19300 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  .}.#endif /* def
19310 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
19320 4c 45 5f 53 54 41 54 33 29 20 2a 2f 0a 0a 23 69  LE_STAT3) */..#i
19330 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19340 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 45  LE_STAT3./*.** E
19350 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
19360 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
19370 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
19380 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
19390 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
193a0 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
193b0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
193c0 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
193d0 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
193e0 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
193f0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
19400 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
19410 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
19420 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
19430 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
19440 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19450 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
19460 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
19470 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
19480 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
19490 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
194a0 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
194b0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
194c0 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
194d0 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
194e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
194f0 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
19500 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
19510 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
19520 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
19530 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
19540 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
19550 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
19560 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
19570 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
19580 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
19590 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
195a0 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
195b0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
195c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
195d0 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
195e0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
195f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20  /.  Index *p,   
19600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19610 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65 66 74  index whose left
19620 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
19630 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 4c  pTerm */.  ExprL
19640 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
19650 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73  /* The value lis
19660 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
19670 22 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c  "x IN (v1,v2,v3,
19680 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64 6f 75 62 6c  ...)" */.  doubl
19690 65 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20  e *pnRow        
196a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
196b0 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
196c0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
196d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
196e0 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  K;         /* Su
196f0 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
19700 20 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c   code */.  doubl
19710 65 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20 20  e nEst;         
19720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19730 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
19740 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
19750 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74 20 3d  double nRowEst =
19760 20 28 64 6f 75 62 6c 65 29 30 3b 20 2f 2a 20 4e   (double)0; /* N
19770 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
19780 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
19790 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
197c0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
197d0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
197e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
197f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
19800 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19810 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
19820 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
19830 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
19840 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
19850 2c 20 70 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  , p, pList->a[i]
19860 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a  .pExpr, &nEst);.
19870 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e      nRowEst += n
19880 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  Est;.  }.  if( r
19890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
198a0 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
198b0 3e 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d  > p->aiRowEst[0]
198c0 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e   ) nRowEst = p->
198d0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
198e0 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
198f0 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  t;.    WHERETRAC
19900 45 28 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d  E(("IN row estim
19910 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20  ate: est=%g\n", 
19920 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20  nRowEst));.  }. 
19930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
19940 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
19950 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
19960 41 54 33 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  AT3) */.../*.** 
19970 46 69 6e 64 20 74 68 65 20 62 65 73 74 20 71 75  Find the best qu
19980 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
19990 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
199a0 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74  lar table.  Writ
199b0 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
199c0 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
199d0 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
199e0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
199f0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
19a00 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  ** last paramete
19a10 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  r..**.** The low
19a20 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69  est cost plan wi
19a30 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
19a40 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
19a50 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
19a60 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
19a70 4f 20 6e 65 65 64 65 64 20 74 6f 20 70 72 6f 63  O needed to proc
19a80 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 65  ess the requeste
19a90 64 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63  d result..** Fac
19aa0 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
19ab0 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
19ac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
19ad0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
19ae0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
19af0 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
19b00 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
19b10 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
19b20 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
19b30 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
19b40 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
19b50 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
19b60 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
19b70 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
19b80 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
19b90 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
19ba0 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
19bb0 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ain table..**.**
19bc0 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   If there was an
19bd0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
19be0 73 65 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78  se (pSrc->pIndex
19bf0 29 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  ) attached to th
19c00 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  e table in.** th
19c10 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  e SQL statement,
19c20 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
19c30 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65  ion only conside
19c40 72 73 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74  rs plans using t
19c50 68 65 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64  he .** named ind
19c60 65 78 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70  ex. If no such p
19c70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  lan is found, th
19c80 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
19c90 63 6f 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54  cost is.** SQLIT
19ca0 45 5f 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20  E_BIG_DBL. If a 
19cb0 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68  plan is found th
19cc0 61 74 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65  at uses the name
19cd0 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65  d index, .** the
19ce0 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20 63 61  n the cost is ca
19cf0 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20  lculated in the 
19d00 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  usual way..**.**
19d10 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45   If a NOT INDEXE
19d20 44 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e  D clause (pSrc->
19d30 6e 6f 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77  notIndexed!=0) w
19d40 61 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  as attached to t
19d50 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20  he table .** in 
19d60 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
19d70 6d 65 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e  ment, then no in
19d80 64 65 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64  dexes are consid
19d90 65 72 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74  ered. However, t
19da0 68 65 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20  he .** selected 
19db0 70 6c 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74  plan may still t
19dc0 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
19dd0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 72 6f   the built-in ro
19de0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  wid primary key.
19df0 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ** index..*/.sta
19e00 74 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72  tic void bestBtr
19e10 65 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  eeIndex(.  Parse
19e20 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19e30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19e40 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
19e50 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
19e60 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
19e70 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
19e80 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
19e90 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
19ea0 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
19eb0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
19ec0 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
19ed0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
19ee0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
19ef0 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  f cursors not av
19f00 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65  ailable for inde
19f10 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
19f20 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20  k notValid,     
19f30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
19f40 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
19f50 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a  or any purpose *
19f60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
19f70 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
19f80 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
19f90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
19fa0 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c  List *pDistinct,
19fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
19fc0 65 6c 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75  elect-list if qu
19fd0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
19fe0 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
19ff0 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
1a000 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
1a010 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
1a020 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
1a030 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
1a040 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
1a050 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
1a060 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
1a070 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
1a080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1a090 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
1a0a0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
1a0b0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1a0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
1a0d0 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a   of pProbe, or z
1a0e0 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65  ero for IPK inde
1a0f0 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  x */.  int eqTer
1a100 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
1a110 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61     /* Current ma
1a120 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61  sk of valid equa
1a130 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
1a140 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65 72  /.  int idxEqTer
1a150 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
1a160 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66  /* Index mask of
1a170 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20   valid equality 
1a180 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49  operators */.  I
1a190 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20  ndex sPk;       
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a1b0 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63  fake index objec
1a1c0 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72  t for the primar
1a1d0 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f 77 63  y key */.  tRowc
1a1e0 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  nt aiRowEstPk[2]
1a1f0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69  ;      /* The ai
1a200 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66  RowEst[] value f
1a210 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
1a220 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75   */.  int aiColu
1a230 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20  mnPk = -1;      
1a240 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e    /* The aColumn
1a250 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  [] value for the
1a260 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   sPk index */.  
1a270 69 6e 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20  int wsFlagMask; 
1a280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a290 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20  llowed flags in 
1a2a0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1a2b0 61 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  ag */..  /* Init
1a2c0 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20  ialize the cost 
1a2d0 74 6f 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20  to a worst-case 
1a2e0 76 61 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  value */.  memse
1a2f0 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
1a300 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
1a310 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
1a320 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
1a330 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
1a340 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
1a350 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
1a360 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
1a370 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
1a380 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
1a390 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
1a3a0 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
1a3b0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
1a3c0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
1a3d0 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
1a3e0 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
1a3f0 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
1a400 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
1a410 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
1a420 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
1a430 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
1a440 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
1a450 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
1a460 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
1a470 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
1a480 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
1a490 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
1a4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1a4b0 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
1a4c0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1a4d0 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
1a4e0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
1a4f0 20 20 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44     /* An INDEXED
1a500 20 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69   BY clause speci
1a510 66 69 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  fies a particula
1a520 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a  r index to use *
1a530 2f 0a 20 20 20 20 70 49 64 78 20 3d 20 70 50 72  /.    pIdx = pPr
1a540 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
1a550 65 78 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61  ex;.    wsFlagMa
1a560 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
1a570 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
1a580 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
1a590 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
1a5a0 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73  TermMask;.  }els
1a5b0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
1a5c0 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59  is no INDEXED BY
1a5d0 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65   clause.  Create
1a5e0 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62   a fake Index ob
1a5f0 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20  ject in local.  
1a600 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50    ** variable sP
1a610 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  k to represent t
1a620 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79  he rowid primary
1a630 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b   key index.  Mak
1a640 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61  e this.    ** fa
1a650 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69 72  ke index the fir
1a660 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66  st in a chain of
1a670 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77   Index objects w
1a680 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ith all of the r
1a690 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63  eal.    ** indic
1a6a0 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  es to follow */.
1a6b0 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
1a6c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a6d0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20      /* First of 
1a6e0 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20  real indices on 
1a6f0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
1a700 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c   memset(&sPk, 0,
1a710 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b   sizeof(Index));
1a720 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
1a730 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
1a740 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
1a750 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
1a760 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73  RowEst = aiRowEs
1a770 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
1a780 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
1a790 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
1a7a0 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
1a7b0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
1a7c0 5d 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ] = pSrc->pTab->
1a7d0 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52  nRowEst;.    aiR
1a7e0 6f 77 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a  owEstPk[1] = 1;.
1a7f0 20 20 20 20 70 46 69 72 73 74 20 3d 20 70 53 72      pFirst = pSr
1a800 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  c->pTab->pIndex;
1a810 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1a820 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a  otIndexed==0 ){.
1a830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61        /* The rea
1a840 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65  l indices of the
1a850 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20   table are only 
1a860 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68  considered if th
1a870 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49  e.      ** NOT I
1a880 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72  NDEXED qualifier
1a890 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d   is omitted from
1a8a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a8b0 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   */.      sPk.pN
1a8c0 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
1a8d0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
1a8e0 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
1a8f0 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
1a900 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
1a910 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
1a920 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
1a930 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
1a940 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
1a950 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
1a960 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
1a970 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
1a980 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
1a990 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
1a9a0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
1a9b0 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
1a9c0 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
1a9d0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
1a9e0 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
1a9f0 63 6f 6e 73 74 20 74 52 6f 77 63 6e 74 20 2a 20  const tRowcnt * 
1aa00 63 6f 6e 73 74 20 61 69 52 6f 77 45 73 74 20 3d  const aiRowEst =
1aa10 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
1aa20 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  t;.    double co
1aa30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1aa40 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
1aa50 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ing pProbe */.  
1aa60 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20    double nRow;  
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa80 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
1aa90 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 72 65 73  r of rows in res
1aaa0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 64  ult set */.    d
1aab0 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 20 3d 20 28  ouble log10N = (
1aac0 64 6f 75 62 6c 65 29 31 3b 20 20 2f 2a 20 62 61  double)1;  /* ba
1aad0 73 65 2d 31 30 20 6c 6f 67 61 72 69 74 68 6d 20  se-10 logarithm 
1aae0 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78 61 63 74  of nRow (inexact
1aaf0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 76  ) */.    int rev
1ab00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ab10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1ab20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20  scan in reverse 
1ab30 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
1ab40 20 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   wsFlags = 0;.  
1ab50 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d    Bitmask used =
1ab60 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   0;..    /* The 
1ab70 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1ab80 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
1ab90 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 70  d based on the p
1aba0 72 6f 70 65 72 74 69 65 73 20 6f 66 0a 20 20 20  roperties of.   
1abb0 20 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20   ** index being 
1abc0 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65 79 20  evaluated. They 
1abd0 61 72 65 20 74 68 65 6e 20 75 73 65 64 20 74 6f  are then used to
1abe0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65   determine the e
1abf0 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a 20 63  xpected.    ** c
1ac00 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ost and number o
1ac10 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2e  f rows returned.
1ac20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ac30 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20  nEq: .    **    
1ac40 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  Number of equali
1ac50 74 79 20 74 65 72 6d 73 20 74 68 61 74 20 63 61  ty terms that ca
1ac60 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n be implemented
1ac70 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
1ac80 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f  ..    **    In o
1ac90 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1aca0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  number of initia
1acb0 6c 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  l fields in the 
1acc0 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 2a  index that.    *
1acd0 2a 20 20 20 20 61 72 65 20 75 73 65 64 20 69 6e  *    are used in
1ace0 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54   == or IN or NOT
1acf0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1ad00 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
1ad10 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  lause..    **.  
1ad20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a    **  nInMul:  .
1ad30 20 20 20 20 2a 2a 20 20 20 20 54 68 65 20 22 69      **    The "i
1ad40 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22 2e 20 54  n-multiplier". T
1ad50 68 69 73 20 69 73 20 61 6e 20 65 73 74 69 6d 61  his is an estima
1ad60 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73  te of how many s
1ad70 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a  eek operations .
1ad80 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
1ad90 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e   must perform on
1ada0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 71 75   the index in qu
1adb0 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  estion. For exam
1adc0 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1add0 20 2a 2a 20 20 20 20 57 48 45 52 45 20 63 6c 61   **    WHERE cla
1ade0 75 73 65 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  use is:.    **. 
1adf0 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45     **      WHERE
1ae00 20 61 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 20   a IN (1, 2, 3) 
1ae10 41 4e 44 20 62 20 49 4e 20 28 34 2c 20 35 2c 20  AND b IN (4, 5, 
1ae20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  6).    **.    **
1ae30 20 20 20 20 53 51 4c 69 74 65 20 6d 75 73 74 20      SQLite must 
1ae40 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70  perform 9 lookup
1ae50 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e  s on an index on
1ae60 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d   (a, b), so nInM
1ae70 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a 20 20 20  ul is .    **   
1ae80 20 73 65 74 20 74 6f 20 39 2e 20 47 69 76 65 6e   set to 9. Given
1ae90 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
1aea0 20 61 6e 64 20 65 69 74 68 65 72 20 6f 66 20 74   and either of t
1aeb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45  he following WHE
1aec0 52 45 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c  RE .    **    cl
1aed0 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  auses:.    **.  
1aee0 20 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20    **      WHERE 
1aef0 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a 20 20 20  a =  1.    **   
1af00 20 20 20 57 48 45 52 45 20 61 20 3e 3d 20 32 0a     WHERE a >= 2.
1af10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1af20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65 74 20 74   nInMul is set t
1af30 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 1..    **.    
1af40 2a 2a 20 20 20 20 49 66 20 74 68 65 72 65 20 65  **    If there e
1af50 78 69 73 74 73 20 61 20 57 48 45 52 45 20 74 65  xists a WHERE te
1af60 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rm of the form "
1af70 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1af80 29 22 2c 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  )", then .    **
1af90 20 20 20 20 74 68 65 20 73 75 62 2d 73 65 6c 65      the sub-sele
1afa0 63 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ct is assumed to
1afb0 20 72 65 74 75 72 6e 20 32 35 20 72 6f 77 73 20   return 25 rows 
1afc0 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
1afd0 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20 20 20 64   of .    **    d
1afe0 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75  etermining nInMu
1aff0 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
1b000 20 20 62 49 6e 45 73 74 3a 20 20 0a 20 20 20 20    bInEst:  .    
1b010 2a 2a 20 20 20 20 53 65 74 20 74 6f 20 74 72 75  **    Set to tru
1b020 65 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  e if there was a
1b030 74 20 6c 65 61 73 74 20 6f 6e 65 20 22 78 20 49  t least one "x I
1b040 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
1b050 74 65 72 6d 20 75 73 65 64 20 0a 20 20 20 20 2a  term used .    *
1b060 2a 20 20 20 20 69 6e 20 64 65 74 65 72 6d 69 6e  *    in determin
1b070 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
1b080 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74   nInMul.  Note t
1b090 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
1b0a0 68 65 0a 20 20 20 20 2a 2a 20 20 20 20 49 4e 20  he.    **    IN 
1b0b0 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
1b0c0 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61   a SELECT, not a
1b0d0 20 76 61 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72   value list, for
1b0e0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0a 20   this variable. 
1b0f0 20 20 20 2a 2a 20 20 20 20 74 6f 20 62 65 20 74     **    to be t
1b100 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue..    **.    
1b110 2a 2a 20 20 72 61 6e 67 65 44 69 76 3a 0a 20 20  **  rangeDiv:.  
1b120 20 20 2a 2a 20 20 20 20 41 6e 20 65 73 74 69 6d    **    An estim
1b130 61 74 65 20 6f 66 20 61 20 64 69 76 69 73 6f 72  ate of a divisor
1b140 20 62 79 20 77 68 69 63 68 20 74 6f 20 72 65 64   by which to red
1b150 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
1b160 70 61 63 65 20 64 75 65 0a 20 20 20 20 2a 2a 20  pace due.    ** 
1b170 20 20 20 74 6f 20 69 6e 65 71 75 61 6c 69 74 79     to inequality
1b180 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 49   constraints.  I
1b190 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
1b1a0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 41 4e   sqlite_stat3 AN
1b1b0 41 4c 59 5a 45 0a 20 20 20 20 2a 2a 20 20 20 20  ALYZE.    **    
1b1c0 64 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69  data, a single i
1b1d0 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65  nequality reduce
1b1e0 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
1b1f0 63 65 20 74 6f 20 31 2f 34 72 64 20 69 74 73 0a  ce to 1/4rd its.
1b200 20 20 20 20 2a 2a 20 20 20 20 6f 72 69 67 69 6e      **    origin
1b210 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65 44 69  al size (rangeDi
1b220 76 3d 3d 34 29 2e 20 20 54 77 6f 20 69 6e 65 71  v==4).  Two ineq
1b230 75 61 6c 69 74 69 65 73 20 72 65 64 75 63 65 20  ualities reduce 
1b240 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
1b250 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
1b260 31 36 74 68 20 6f 66 20 69 74 73 20 6f 72 69 67  16th of its orig
1b270 69 6e 61 6c 20 73 69 7a 65 20 28 72 61 6e 67 65  inal size (range
1b280 44 69 76 3d 3d 31 36 29 2e 0a 20 20 20 20 2a 2a  Div==16)..    **
1b290 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
1b2a0 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
1b2b0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1b2c0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1b2d0 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
1b2e0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1b2f0 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1b300 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
1b310 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
1b320 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1b330 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
1b340 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
1b350 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
1b360 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c     **.    **  bL
1b370 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20  ookup: .    **  
1b380 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
1b390 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  if a table looku
1b3a0 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  p is required fo
1b3b0 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74  r each index ent
1b3c0 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73  ry.    **    vis
1b3d0 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20  ited.  In other 
1b3e0 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20 74  words, true if t
1b3f0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76  his is not a cov
1b400 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
1b410 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20 61   **    This is a
1b420 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20  lways false for 
1b430 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72  the rowid primar
1b440 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61  y key index of a
1b450 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20   table..    **  
1b460 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65    For other inde
1b470 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65 20  xes, it is true 
1b480 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63  unless all the c
1b490 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1b4a0 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73  ble.    **    us
1b4b0 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
1b4c0 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70   statement are p
1b4d0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
1b4e0 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20  dex (such an.   
1b4f0 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20   **    index is 
1b500 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
1b510 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
1b520 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
1b530 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
1b540 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
1b550 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
1b560 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
1b570 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
1b580 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
1b590 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
1b5a0 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  tree lookups in 
1b5b0 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68  order to find th
1b5c0 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20  e value.    **  
1b5d0 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62    of column c, b
1b5e0 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65  ut the first doe
1b5f0 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f  s not because co
1b600 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72  lumns a and b ar
1b610 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68  e.    **    both
1b620 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1b630 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  e index..    **.
1b640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1b650 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20     SELECT a, b  
1b660 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45    FROM tbl WHERE
1b670 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20   a = 1;.    **  
1b680 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1b690 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
1b6a0 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1b6b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1b6c0 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1b6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b6e0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1b6f0 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 69 6e  erms matching in
1b700 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  dex */.    int b
1b710 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20  InEst = 0;      
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b730 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43   if "x IN (SELEC
1b740 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20  T...)" seen */. 
1b750 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20     int nInMul = 
1b760 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1b770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
1b780 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65  stinct equalitie
1b790 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  s to lookup */. 
1b7a0 20 20 20 64 6f 75 62 6c 65 20 72 61 6e 67 65 44     double rangeD
1b7b0 69 76 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 20  iv = (double)1; 
1b7c0 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65   /* Estimated re
1b7d0 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63  duction in searc
1b7e0 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  h space */.    i
1b7f0 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20  nt nBound = 0;  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b810 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20  Number of range 
1b820 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e  constraints seen
1b830 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f 72   */.    int bSor
1b840 74 20 3d 20 21 21 70 4f 72 64 65 72 42 79 3b 20  t = !!pOrderBy; 
1b850 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b860 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72   external sort r
1b870 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
1b880 6e 74 20 62 44 69 73 74 20 3d 20 21 21 70 44 69  nt bDist = !!pDi
1b890 73 74 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  stinct;      /* 
1b8a0 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63 61  True if index ca
1b8b0 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44  nnot help with D
1b8c0 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69  ISTINCT */.    i
1b8d0 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20  nt bLookup = 0; 
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b8f0 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f  True if not a co
1b900 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1b910 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1b920 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1b930 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
1b940 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1b950 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66  clause */.#ifdef
1b960 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1b970 54 41 54 33 0a 20 20 20 20 57 68 65 72 65 54 65  TAT3.    WhereTe
1b980 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d  rm *pFirstTerm =
1b990 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20   0;    /* First 
1b9a0 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68  term matching th
1b9b0 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69  e index */.#endi
1b9c0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  f..    /* Determ
1b9d0 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1b9e0 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nEq and nInMul
1b9f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d   */.    for(nEq=
1ba00 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  0; nEq<pProbe->n
1ba10 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a  Column; nEq++){.
1ba20 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1ba30 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
1ba40 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
1ba50 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1ba60 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1ba70 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
1ba80 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  pIdx);.      if(
1ba90 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
1baa0 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  k;.      wsFlags
1bab0 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d   |= (WHERE_COLUM
1bac0 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  N_EQ|WHERE_ROWID
1bad0 5f 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _EQ);.      test
1bae0 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 57 43  case( pTerm->pWC
1baf0 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 69  !=pWC );.      i
1bb00 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1bb10 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20  tor & WO_IN ){. 
1bb20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
1bb30 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
1bb40 72 3b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  r;.        wsFla
1bb50 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1bb60 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
1bb70 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1bb80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1bb90 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1bba0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
1bbb0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73  ELECT ...)":  As
1bbc0 73 75 6d 65 20 74 68 65 20 53 45 4c 45 43 54 20  sume the SELECT 
1bbd0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
1bbe0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  */.          nIn
1bbf0 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  Mul *= 25;.     
1bc00 20 20 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b       bInEst = 1;
1bc10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1bc20 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
1bc30 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
1bc40 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1bc50 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1bc60 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
1bc70 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
1bc80 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
1bc90 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  l *= pExpr->x.pL
1bca0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1bcb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1bcc0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1bcd0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
1bce0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73  LL ){.        ws
1bcf0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1bd00 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
1bd10 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1bd20 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20  E_ENABLE_STAT3. 
1bd30 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
1bd40 26 26 20 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70  && pProbe->aSamp
1bd50 6c 65 20 29 20 70 46 69 72 73 74 54 65 72 6d 20  le ) pFirstTerm 
1bd60 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a  = pTerm;.#endif.
1bd70 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
1bd80 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1bd90 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
1bda0 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   If the index be
1bdb0 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 69  ing considered i
1bdc0 73 20 55 4e 49 51 55 45 2c 20 61 6e 64 20 74 68  s UNIQUE, and th
1bdd0 65 72 65 20 69 73 20 61 6e 20 65 71 75 61 6c 69  ere is an equali
1bde0 74 79 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  ty .    ** const
1bdf0 72 61 69 6e 74 20 66 6f 72 20 61 6c 6c 20 63 6f  raint for all co
1be00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
1be10 65 78 2c 20 74 68 65 6e 20 74 68 69 73 20 73 65  ex, then this se
1be20 61 72 63 68 20 77 69 6c 6c 20 66 69 6e 64 0a 20  arch will find. 
1be30 20 20 20 2a 2a 20 61 74 20 6d 6f 73 74 20 61 20     ** at most a 
1be40 73 69 6e 67 6c 65 20 72 6f 77 2e 20 49 6e 20 74  single row. In t
1be50 68 69 73 20 63 61 73 65 20 73 65 74 20 74 68 65  his case set the
1be60 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 66 6c   WHERE_UNIQUE fl
1be70 61 67 20 74 6f 20 0a 20 20 20 20 2a 2a 20 69 6e  ag to .    ** in
1be80 64 69 63 61 74 65 20 74 68 69 73 20 74 6f 20 74  dicate this to t
1be90 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  he caller..    *
1bea0 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
1beb0 73 65 2c 20 69 66 20 74 68 65 20 73 65 61 72 63  se, if the searc
1bec0 68 20 6d 61 79 20 66 69 6e 64 20 6d 6f 72 65 20  h may find more 
1bed0 74 68 61 6e 20 6f 6e 65 20 72 6f 77 2c 20 74 65  than one row, te
1bee0 73 74 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  st to see if.   
1bef0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 72   ** there is a r
1bf00 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1bf10 6f 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  on indexed colum
1bf20 6e 20 28 6e 45 71 2b 31 29 20 74 68 61 74 20 63  n (nEq+1) that c
1bf30 61 6e 20 62 65 20 0a 20 20 20 20 2a 2a 20 6f 70  an be .    ** op
1bf40 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
1bf50 65 20 69 6e 64 65 78 2e 20 0a 20 20 20 20 2a 2f  e index. .    */
1bf60 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 50  .    if( nEq==pP
1bf70 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26  robe->nColumn &&
1bf80 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
1bf90 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
1bfa0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
1bfb0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1bfc0 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  UMN_IN );.      
1bfd0 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
1bfe0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1bff0 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69  _NULL );.      i
1c000 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 28 57  f( (wsFlags & (W
1c010 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57  HERE_COLUMN_IN|W
1c020 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
1c030 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))==0 ){.       
1c040 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1c050 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
1c060 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1c070 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
1c080 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ed==0 ){.      i
1c090 6e 74 20 6a 20 3d 20 28 6e 45 71 3d 3d 70 50 72  nt j = (nEq==pPr
1c0a0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d  obe->nColumn ? -
1c0b0 31 20 3a 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  1 : pProbe->aiCo
1c0c0 6c 75 6d 6e 5b 6e 45 71 5d 29 3b 0a 20 20 20 20  lumn[nEq]);.    
1c0d0 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
1c0e0 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
1c0f0 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
1c100 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
1c110 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
1c120 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70   WhereTerm *pTop
1c130 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1c140 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1c150 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
1c160 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
1c170 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74 6d 20  WhereTerm *pBtm 
1c180 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1c190 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
1c1a0 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
1c1b0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 77  pIdx);.        w
1c1c0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
1c1d0 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c  (pParse, pProbe,
1c1e0 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54 6f 70   nEq, pBtm, pTop
1c1f0 2c 20 26 72 61 6e 67 65 44 69 76 29 3b 0a 20 20  , &rangeDiv);.  
1c200 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 20 29        if( pTop )
1c210 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f 75  {.          nBou
1c220 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nd = 1;.        
1c230 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45    wsFlags |= WHE
1c240 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
1c250 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20          used |= 
1c260 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68  pTop->prereqRigh
1c270 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
1c280 74 63 61 73 65 28 20 70 54 6f 70 2d 3e 70 57 43  tcase( pTop->pWC
1c290 21 3d 70 57 43 20 29 3b 0a 20 20 20 20 20 20 20  !=pWC );.       
1c2a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1c2b0 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Btm ){.         
1c2c0 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20 20 20   nBound++;.     
1c2d0 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20       wsFlags |= 
1c2e0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
1c2f0 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20  .          used 
1c300 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65 71 52  |= pBtm->prereqR
1c310 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1c320 74 65 73 74 63 61 73 65 28 20 70 42 74 6d 2d 3e  testcase( pBtm->
1c330 70 57 43 21 3d 70 57 43 20 29 3b 0a 20 20 20 20  pWC!=pWC );.    
1c340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 73      }.        ws
1c350 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45 5f  Flags |= (WHERE_
1c360 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
1c370 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 3b  RE_ROWID_RANGE);
1c380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c3a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1c3b0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e  lause and the in
1c3c0 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  dex being consid
1c3d0 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ered will.    **
1c3e0 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20   naturally scan 
1c3f0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1c400 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20  ired order, set 
1c410 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
1c420 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20  flags.    ** in 
1c430 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69  wsFlags. Otherwi
1c440 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  se, if there is 
1c450 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1c460 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65 78  se but the index
1c470 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  .    ** will sca
1c480 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66  n rows in a diff
1c490 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74  erent order, set
1c4a0 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69 61   the bSort varia
1c4b0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
1c4c0 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1c4e0 65 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  e, pWC->pMaskSet
1c4f0 2c 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20  , pProbe, iCur, 
1c500 70 4f 72 64 65 72 42 79 2c 20 6e 45 71 2c 20 77  pOrderBy, nEq, w
1c510 73 46 6c 61 67 73 2c 20 26 72 65 76 29 0a 20 20  sFlags, &rev).  
1c520 20 20 29 7b 0a 20 20 20 20 20 20 62 53 6f 72 74    ){.      bSort
1c530 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 73 46 6c   = 0;.      wsFl
1c540 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57  ags |= WHERE_ROW
1c550 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  ID_RANGE|WHERE_C
1c560 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
1c570 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
1c580 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76   wsFlags |= (rev
1c590 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   ? WHERE_REVERSE
1c5a0 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   : 0);.    }..  
1c5b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1c5c0 20 61 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c   a DISTINCT qual
1c5d0 69 66 69 65 72 20 61 6e 64 20 74 68 69 73 20 69  ifier and this i
1c5e0 6e 64 65 78 20 77 69 6c 6c 20 73 63 61 6e 20 72  ndex will scan r
1c5f0 6f 77 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 72  ows in.    ** or
1c600 64 65 72 20 6f 66 20 74 68 65 20 44 49 53 54 49  der of the DISTI
1c610 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  NCT expressions,
1c620 20 63 6c 65 61 72 20 62 44 69 73 74 20 61 6e 64   clear bDist and
1c630 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1c640 69 61 74 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  iate.    ** flag
1c650 73 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 2a 2f  s in wsFlags. */
1c660 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
1c670 6e 63 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  nctIndex(pParse,
1c680 20 70 57 43 2c 20 70 50 72 6f 62 65 2c 20 69 43   pWC, pProbe, iC
1c690 75 72 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 6e  ur, pDistinct, n
1c6a0 45 71 29 0a 20 20 20 20 20 26 26 20 28 77 73 46  Eq).     && (wsF
1c6b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1c6c0 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 29  UMN_IN)==0.    )
1c6d0 7b 0a 20 20 20 20 20 20 62 44 69 73 74 20 3d 20  {.      bDist = 
1c6e0 30 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  0;.      wsFlags
1c6f0 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f   |= WHERE_ROWID_
1c700 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
1c710 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 44  MN_RANGE|WHERE_D
1c720 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a  ISTINCT;.    }..
1c730 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e      /* If curren
1c740 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  tly calculating 
1c750 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  the cost of usin
1c760 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20  g an index (not 
1c770 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69  the IPK.    ** i
1c780 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65  ndex), determine
1c790 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64   if all required
1c7a0 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79   column data may
1c7b0 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74   be obtained wit
1c7c0 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69  hout .    ** usi
1c7d0 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ng the main tabl
1c7e0 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69  e (i.e. if the i
1c7f0 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69  ndex is a coveri
1c800 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  ng.    ** index 
1c810 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e  for this query).
1c820 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74   If it is, set t
1c830 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  he WHERE_IDX_ONL
1c840 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a  Y flag in.    **
1c850 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
1c860 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f  ise, set the bLo
1c870 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f  okup variable to
1c880 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69   true.  */.    i
1c890 66 28 20 70 49 64 78 20 26 26 20 77 73 46 6c 61  f( pIdx && wsFla
1c8a0 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  gs ){.      Bitm
1c8b0 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
1c8c0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74  lUsed;.      int
1c8d0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
1c8e0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
1c8f0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1c900 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
1c910 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1c920 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
1c930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20   ){.          m 
1c940 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31  &= ~(((Bitmask)1
1c950 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  )<<x);.        }
1c960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c970 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
1c980 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1c990 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1c9a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c9b0 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
1c9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c9d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
1c9e0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1c9f0 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
1ca00 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49  ut.  For an "x I
1ca10 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20  N (SELECT...)". 
1ca20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1ca30 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  , do not let the
1ca40 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
1ca50 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
1ca60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1ca70 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28   */.    nRow = (
1ca80 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74  double)(aiRowEst
1ca90 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  [nEq] * nInMul);
1caa0 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
1cab0 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45  && nRow*2>aiRowE
1cac0 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e  st[0] ){.      n
1cad0 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
1cae0 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
1caf0 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f  l = (int)(nRow /
1cb00 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b   aiRowEst[nEq]);
1cb10 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1cb20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1cb30 54 33 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  T3.    /* If the
1cb40 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1cb50 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c  f the form x=VAL
1cb60 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c 45  UE or x IN (E1,E
1cb70 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e  2,...).    ** an
1cb80 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e  d we do not thin
1cb90 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  k that values of
1cba0 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e   x are unique an
1cbb0 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a 20  d if histogram. 
1cbc0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1cbd0 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1cbe0 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1cbf0 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1cc00 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1cc10 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1cc20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1cc30 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1cc40 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1cc50 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1cc60 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1cc70 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1cc80 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1cc90 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62 6c 65  if( nRow>(double
1cca0 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26 26 20  )1 && nEq==1 && 
1ccb0 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20 26 26  pFirstTerm!=0 &&
1ccc0 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31 20 29   aiRowEst[1]>1 )
1ccd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cce0 28 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70  (pFirstTerm->eOp
1ccf0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
1cd00 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
1cd10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
1cd20 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f  ( pFirstTerm->eO
1cd30 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51  perator & (WO_EQ
1cd40 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  |WO_ISNULL) ){. 
1cd50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1cd60 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70   pFirstTerm->eOp
1cd70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
1cd80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1cd90 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65  e( pFirstTerm->e
1cda0 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
1cdb0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 77  ULL );.        w
1cdc0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
1cdd0 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c  (pParse, pProbe,
1cde0 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45 78   pFirstTerm->pEx
1cdf0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 52 6f  pr->pRight, &nRo
1ce00 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  w);.      }else 
1ce10 69 66 28 20 62 49 6e 45 73 74 3d 3d 30 20 29 7b  if( bInEst==0 ){
1ce20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ce30 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70   pFirstTerm->eOp
1ce40 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b  erator==WO_IN );
1ce50 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 49 6e  .        whereIn
1ce60 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
1ce70 70 50 72 6f 62 65 2c 20 70 46 69 72 73 74 54 65  pProbe, pFirstTe
1ce80 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rm->pExpr->x.pLi
1ce90 73 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20 20 20  st, &nRow);.    
1cea0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
1ceb0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1cec0 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20 20  E_STAT3 */..    
1ced0 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e 75  /* Adjust the nu
1cee0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
1cef0 6f 77 73 20 61 6e 64 20 64 6f 77 6e 77 61 72 64  ows and downward
1cf00 20 74 6f 20 72 65 66 6c 65 63 74 20 72 6f 77 73   to reflect rows
1cf10 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65  .    ** that are
1cf20 20 65 78 63 6c 75 64 65 64 20 62 79 20 72 61 6e   excluded by ran
1cf30 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ge constraints..
1cf40 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20      */.    nRow 
1cf50 3d 20 6e 52 6f 77 2f 72 61 6e 67 65 44 69 76 3b  = nRow/rangeDiv;
1cf60 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 3c 31 20  .    if( nRow<1 
1cf70 29 20 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20  ) nRow = 1;..   
1cf80 20 2f 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20   /* Experiments 
1cf90 72 75 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69  run on real SQLi
1cfa0 74 65 20 64 61 74 61 62 61 73 65 73 20 73 68 6f  te databases sho
1cfb0 77 20 74 68 61 74 20 74 68 65 20 74 69 6d 65 20  w that the time 
1cfc0 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f  needed.    ** to
1cfd0 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   do a binary sea
1cfe0 72 63 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  rch to locate a 
1cff0 72 6f 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f  row in a table o
1d000 72 20 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68  r index is rough
1d010 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28  ly.    ** log10(
1d020 4e 29 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d  N) times the tim
1d030 65 20 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f  e to move from o
1d040 6e 65 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65  ne row to the ne
1d050 78 74 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20  xt row within.  
1d060 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20    ** a table or 
1d070 69 6e 64 65 78 2e 20 20 54 68 65 20 61 63 74 75  index.  The actu
1d080 61 6c 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72  al times can var
1d090 79 2c 20 77 69 74 68 20 74 68 65 20 73 69 7a 65  y, with the size
1d0a0 20 6f 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72   of.    ** recor
1d0b0 64 73 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f  ds being an impo
1d0c0 72 74 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42  rtant factor.  B
1d0d0 6f 74 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65  oth moves and se
1d0e0 61 72 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a  arches are.    *
1d0f0 2a 20 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61  * slower with la
1d100 72 67 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72  rger records, pr
1d110 65 73 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65  esumably because
1d120 20 66 65 77 65 72 20 72 65 63 6f 72 64 73 20 66   fewer records f
1d130 69 74 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65  it.    ** on one
1d140 20 70 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20   page and hence 
1d150 6d 6f 72 65 20 70 61 67 65 73 20 68 61 76 65 20  more pages have 
1d160 74 6f 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20  to be fetched.. 
1d170 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1d180 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1d190 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
1d1a0 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65  stat1 and sqlite
1d1b0 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20 64 6f  _stat3 tables do
1d1c0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65  .    ** not give
1d1d0 20 75 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20   us data on the 
1d1e0 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
1d1f0 66 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  f table and inde
1d200 78 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  x records..    *
1d210 2a 20 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74  * So this comput
1d220 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61  ation assumes ta
1d230 62 6c 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  ble records are 
1d240 61 62 6f 75 74 20 74 77 69 63 65 20 61 73 20 62  about twice as b
1d250 69 67 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64  ig.    ** as ind
1d260 65 78 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a  ex records.    *
1d270 2f 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61  /.    if( (wsFla
1d280 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46  gs & WHERE_NOT_F
1d290 55 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20  ULLSCAN)==0 ){. 
1d2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
1d2b0 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
1d2c0 20 73 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65   scan is a numbe
1d2d0 72 20 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74  r of move operat
1d2e0 69 6f 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20  ions equal.     
1d2f0 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65   ** to the numbe
1d300 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d310 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a   table..      **
1d320 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64  .      ** We add
1d330 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34   an additional 4
1d340 78 20 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c  x penalty to ful
1d350 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20  l table scans.  
1d360 54 68 69 73 20 63 61 75 73 65 73 0a 20 20 20 20  This causes.    
1d370 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75    ** the cost fu
1d380 6e 63 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e  nction to err on
1d390 20 74 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f   the side of cho
1d3a0 6f 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f  osing an index o
1d3b0 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f  ver.      ** cho
1d3c0 6f 73 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61  osing a full sca
1d3d0 6e 2e 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c  n.  This 4x full
1d3e0 2d 73 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73  -scan penalty is
1d3f0 20 61 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20   an arguable.   
1d400 20 20 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61     ** decision a
1d410 6e 64 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20  nd one which we 
1d420 65 78 70 65 63 74 20 74 6f 20 72 65 76 69 73 69  expect to revisi
1d430 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1d440 20 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69    But.      ** i
1d450 74 20 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f  t seems to be wo
1d460 72 6b 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67  rking well enoug
1d470 68 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e  h at the moment.
1d480 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d490 63 6f 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b  cost = aiRowEst[
1d4a0 30 5d 2a 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  0]*4;.    }else{
1d4b0 0a 20 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20  .      log10N = 
1d4c0 65 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b  estLog(aiRowEst[
1d4d0 30 5d 29 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  0]);.      cost 
1d4e0 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  = nRow;.      if
1d4f0 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( pIdx ){.      
1d500 20 20 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b    if( bLookup ){
1d510 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  .          /* Fo
1d520 72 20 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  r an index looku
1d530 70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  p followed by a 
1d540 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20  table lookup:.  
1d550 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49          **    nI
1d560 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63  nMul index searc
1d570 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20  hes to find the 
1d580 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e  start of each in
1d590 64 65 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20  dex range.      
1d5a0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1d5b0 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1d5c0 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
1d5d0 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c   **  + nRow tabl
1d5e0 65 20 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f  e searches to lo
1d5f0 6f 6b 75 70 20 74 68 65 20 74 61 62 6c 65 20 65  okup the table e
1d600 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 72  ntry using the r
1d610 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a  owid.          *
1d620 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  /.          cost
1d630 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52   += (nInMul + nR
1d640 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  ow)*log10N;.    
1d650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d660 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f       /* For a co
1d670 76 65 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20  vering index:.  
1d680 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e          **     n
1d690 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72  InMul index sear
1d6a0 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65  ches to find the
1d6b0 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a   initial entry .
1d6c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b            **   +
1d6d0 20 6e 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f   nRow steps thro
1d6e0 75 67 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20  ugh the index.  
1d6f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d700 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e       cost += nIn
1d710 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20  Mul*log10N;.    
1d720 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1d730 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  e{.        /* Fo
1d740 72 20 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72  r a rowid primar
1d750 79 20 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20  y key lookup:.  
1d760 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
1d770 75 6c 74 20 74 61 62 6c 65 20 73 65 61 72 63 68  ult table search
1d780 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1d790 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72  nitial entry for
1d7a0 20 65 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20   each range.    
1d7b0 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73      **  + nRow s
1d7c0 74 65 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  teps through the
1d7d0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
1d7e0 2f 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  /.        cost +
1d7f0 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b  = nInMul*log10N;
1d800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d810 20 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68      /* Add in th
1d820 65 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74  e estimated cost
1d830 20 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20   of sorting the 
1d840 72 65 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20  result.  Actual 
1d850 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20  experimental.   
1d860 20 2a 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73   ** measurements
1d870 20 6f 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66   of sorting perf
1d880 6f 72 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74  ormance in SQLit
1d890 65 20 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74  e show that sort
1d8a0 69 6e 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ing time.    ** 
1d8b0 61 64 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e  adds C*N*log10(N
1d8c0 29 20 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77  ) to the cost, w
1d8d0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1d8e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
1d8f0 62 65 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65  be .    ** sorte
1d900 64 20 61 6e 64 20 43 20 69 73 20 61 20 66 61 63  d and C is a fac
1d910 74 6f 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35  tor between 1.95
1d920 20 61 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69   and 4.3.  We wi
1d930 6c 6c 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20  ll split the.   
1d940 20 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61   ** difference a
1d950 6e 64 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33  nd select C of 3
1d960 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .0..    */.    i
1d970 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( bSort ){.    
1d980 20 20 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65    cost += nRow*e
1d990 73 74 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20  stLog(nRow)*3;. 
1d9a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69     }.    if( bDi
1d9b0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  st ){.      cost
1d9c0 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28   += nRow*estLog(
1d9d0 6e 52 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a  nRow)*3;.    }..
1d9e0 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f      /**** Cost o
1d9f0 66 20 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64  f using this ind
1da00 65 78 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  ex has now been 
1da10 63 6f 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a  computed ****/..
1da20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1da30 61 72 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63  are additional c
1da40 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
1da50 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 63 61  is table that ca
1da60 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75  nnot.    ** be u
1da70 73 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  sed with the cur
1da80 72 65 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20  rent index, but 
1da90 77 68 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65  which might lowe
1daa0 72 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  r the number.   
1dab0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f   ** of output ro
1dac0 77 73 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e  ws, adjust the n
1dad0 52 6f 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64  Row value accord
1dae0 69 6e 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c  ingly.  This onl
1daf0 79 20 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72  y .    ** matter
1db00 73 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  s if the current
1db10 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65   index is the le
1db20 61 73 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64  ast costly, so d
1db30 6f 20 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20  o not bother.   
1db40 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 73 74   ** with this st
1db50 65 70 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  ep if we already
1db60 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78   know this index
1db70 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f   will not be cho
1db80 73 65 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  sen..    ** Also
1db90 2c 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  , never reduce t
1dba0 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
1dbb0 75 6e 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e  unt below 2 usin
1dbc0 67 20 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20  g this step..   
1dbd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73   **.    ** It is
1dbe0 20 63 72 69 74 69 63 61 6c 20 74 68 61 74 20 74   critical that t
1dbf0 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b  he notValid mask
1dc00 20 62 65 20 75 73 65 64 20 68 65 72 65 20 69 6e   be used here in
1dc10 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
1dc20 74 68 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73  the notReady mas
1dc30 6b 2e 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69  k.  When computi
1dc40 6e 67 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20  ng an "optimal" 
1dc50 69 6e 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65  index, the notRe
1dc60 61 64 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20  ady.    ** mask 
1dc70 77 69 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f  will only have o
1dc80 6e 65 20 62 69 74 20 73 65 74 20 2d 20 74 68 65  ne bit set - the
1dc90 20 62 69 74 20 66 6f 72 20 74 68 65 20 63 75 72   bit for the cur
1dca0 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20  rent table..    
1dcb0 2a 2a 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20  ** The notValid 
1dcc0 6d 61 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68  mask, on the oth
1dcd0 65 72 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20  er hand, always 
1dce0 68 61 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74  has all bits set
1dcf0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c   for.    ** tabl
1dd00 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
1dd10 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20  in outer loops. 
1dd20 20 49 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20   If notReady is 
1dd30 75 73 65 64 20 68 65 72 65 20 69 6e 73 74 65 61  used here instea
1dd40 64 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56  d.    ** of notV
1dd50 61 6c 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74  alid, then a opt
1dd60 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  imal index that 
1dd70 64 65 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72  depends on inner
1dd80 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20   joins loops.   
1dd90 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c   ** might be sel
1dda0 65 63 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20  ected even when 
1ddb0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20  there exists an 
1ddc0 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68  optimal index th
1ddd0 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  at has.    ** no
1dde0 20 73 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79   such dependency
1ddf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1de00 20 6e 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c   nRow>2 && cost<
1de10 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b  =pCost->rCost ){
1de20 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1de50 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1de60 20 6e 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20   nSkipEq = nEq; 
1de70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1de80 62 65 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72  ber of == constr
1de90 61 69 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f  aints to skip */
1dea0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70  .      int nSkip
1deb0 52 61 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20  Range = nBound; 
1dec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ded0 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74   < constraints t
1dee0 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20  o skip */.      
1def0 42 69 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b  Bitmask thisTab;
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df10 42 69 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20  Bitmap for pSrc 
1df20 2a 2f 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61  */..      thisTa
1df30 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d  b = getMask(pWC-
1df40 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29  >pMaskSet, iCur)
1df50 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  ;.      for(pTer
1df60 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
1df70 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26  >nTerm; nRow>2 &
1df80 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  & k; k--, pTerm+
1df90 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1dfa0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1dfb0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20   TERM_VIRTUAL ) 
1dfc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1dfd0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
1dfe0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c  ereqAll & notVal
1dff0 69 64 29 21 3d 74 68 69 73 54 61 62 20 29 20 63  id)!=thisTab ) c
1e000 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e010 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1e020 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1e030 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
1e040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e050 20 6e 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20   nSkipEq ){.    
1e060 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1e070 65 20 74 68 65 20 66 69 72 73 74 20 6e 45 71 20  e the first nEq 
1e080 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73  equality matches
1e090 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78   since the index
1e0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e0b0 68 61 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f  has already acco
1e0c0 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73 65 20  unted for these 
1e0d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  */.            n
1e0e0 53 6b 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20  SkipEq--;.      
1e0f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e100 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
1e110 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c   each additional
1e120 20 65 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20   equality match 
1e130 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73 75  reduces the resu
1e140 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  lt.            *
1e150 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61 20  * set size by a 
1e160 66 61 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a  factor of 10 */.
1e170 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
1e180 20 2f 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20   /= 10;.        
1e190 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e1a0 65 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70  e if( pTerm->eOp
1e1b0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
1e1c0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
1e1d0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  E) ){.          
1e1e0 69 66 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29  if( nSkipRange )
1e1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e200 20 49 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73   Ignore the firs
1e210 74 20 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e  t nSkipRange ran
1e220 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73  ge constraints s
1e230 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1e240 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1e250 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1e260 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1e270 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1e280 69 70 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20  ipRange--;.     
1e290 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e2a0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
1e2b0 65 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  e each additiona
1e2c0 6c 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  l range constrai
1e2d0 6e 74 20 72 65 64 75 63 65 73 20 74 68 65 20 72  nt reduces the r
1e2e0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
1e2f0 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79    ** set size by
1e300 20 61 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20   a factor of 3. 
1e310 20 49 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63   Indexed range c
1e320 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 64 75 63  onstraints reduc
1e330 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1e340 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
1e350 65 20 62 79 20 61 20 6c 61 72 67 65 72 20 66 61  e by a larger fa
1e360 63 74 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b  ctor: 4.  We mak
1e370 65 20 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a  e indexed range.
1e380 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
1e390 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e  ore selective in
1e3a0 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61  tentionally beca
1e3b0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65  use of the subje
1e3c0 63 74 69 76 65 20 0a 20 20 20 20 20 20 20 20 20  ctive .         
1e3d0 20 20 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f     ** observatio
1e3e0 6e 20 74 68 61 74 20 69 6e 64 65 78 65 64 20 72  n that indexed r
1e3f0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
1e400 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65   really are more
1e410 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e420 73 65 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61  selective in pra
1e430 63 74 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67  ctice, on averag
1e440 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1e450 20 20 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20    nRow /= 3;.   
1e460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e470 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d   }else if( pTerm
1e480 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
1e490 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 20 20  NOOP ){.        
1e4a0 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65    /* Any other e
1e4b0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73  xpression lowers
1e4c0 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20   the output row 
1e4d0 63 6f 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f  count by half */
1e4e0 0a 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20  .          nRow 
1e4f0 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 2;.        }.
1e500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e510 28 20 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20  ( nRow<2 ) nRow 
1e520 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  = 2;.    }...   
1e530 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20 20   WHERETRACE((.  
1e540 20 20 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71      "%s(%s): nEq
1e550 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 72 61  =%d nInMul=%d ra
1e560 6e 67 65 44 69 76 3d 25 64 20 62 53 6f 72 74 3d  ngeDiv=%d bSort=
1e570 25 64 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73  %d bLookup=%d ws
1e580 46 6c 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20  Flags=0x%x\n".  
1e590 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f      "         no
1e5a0 74 52 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f  tReady=0x%llx lo
1e5b0 67 31 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25  g10N=%.1f nRow=%
1e5c0 2e 31 66 20 63 6f 73 74 3d 25 2e 31 66 20 75 73  .1f cost=%.1f us
1e5d0 65 64 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20  ed=0x%llx\n",.  
1e5e0 20 20 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e      pSrc->pTab->
1e5f0 7a 4e 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70  zName, (pIdx ? p
1e600 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70  Idx->zName : "ip
1e610 6b 22 29 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c  k"), .      nEq,
1e620 20 6e 49 6e 4d 75 6c 2c 20 28 69 6e 74 29 72 61   nInMul, (int)ra
1e630 6e 67 65 44 69 76 2c 20 62 53 6f 72 74 2c 20 62  ngeDiv, bSort, b
1e640 4c 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c  Lookup, wsFlags,
1e650 0a 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 2c  .      notReady,
1e660 20 6c 6f 67 31 30 4e 2c 20 6e 52 6f 77 2c 20 63   log10N, nRow, c
1e670 6f 73 74 2c 20 75 73 65 64 0a 20 20 20 20 29 29  ost, used.    ))
1e680 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1e690 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
1e6a0 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
1e6b0 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
1e6c0 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
1e6d0 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
1e6e0 6f 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74  ost in the pCost
1e6f0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
1e700 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64  */.    if( (!pId
1e710 78 20 7c 7c 20 77 73 46 6c 61 67 73 29 0a 20 20  x || wsFlags).  
1e720 20 20 20 26 26 20 28 63 6f 73 74 3c 70 43 6f 73     && (cost<pCos
1e730 74 2d 3e 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73  t->rCost || (cos
1e740 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20  t<=pCost->rCost 
1e750 26 26 20 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70  && nRow<pCost->p
1e760 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29  lan.nRow)).    )
1e770 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72  {.      pCost->r
1e780 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
1e790 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d     pCost->used =
1e7a0 20 75 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f   used;.      pCo
1e7b0 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20  st->plan.nRow = 
1e7c0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73  nRow;.      pCos
1e7d0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
1e7e0 3d 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61  = (wsFlags&wsFla
1e7f0 67 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43  gMask);.      pC
1e800 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  ost->plan.nEq = 
1e810 6e 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  nEq;.      pCost
1e820 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20  ->plan.u.pIdx = 
1e830 70 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pIdx;.    }..   
1e840 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1e850 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
1e860 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
1e870 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
1e880 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
1e890 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
1e8a0 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
1e8b0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52  break;..    /* R
1e8c0 65 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74  eset masks for t
1e8d0 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e  he next index in
1e8e0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1e8f0 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
1e900 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
1e910 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
1e920 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
1e930 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
1e940 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
1e950 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
1e960 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
1e970 74 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72  the SQLITE_Rever
1e980 73 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a  seOrder flag.  *
1e990 2a 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  * is set, then r
1e9a0 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72  everse the order
1e9b0 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
1e9c0 77 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a  will be scanned.
1e9d0 20 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73    ** in. This is
1e9e0 20 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63   used for applic
1e9f0 61 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74  ation testing, t
1ea00 6f 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65  o help find case
1ea10 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70  s.  ** where app
1ea20 6c 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f  lication behavio
1ea30 75 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ur depends on th
1ea40 65 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72  e (undefined) or
1ea50 64 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51  der that.  ** SQ
1ea60 4c 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77  Lite outputs row
1ea70 73 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65  s in in the abse
1ea80 6e 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20  nce of an ORDER 
1ea90 42 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20  BY clause.  */. 
1eaa0 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26   if( !pOrderBy &
1eab0 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  & pParse->db->fl
1eac0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
1ead0 65 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20  erseOrder ){.   
1eae0 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
1eaf0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
1eb00 56 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73  VERSE;.  }..  as
1eb10 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c  sert( pOrderBy |
1eb20 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  | (pCost->plan.w
1eb30 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  sFlags&WHERE_ORD
1eb40 45 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ERBY)==0 );.  as
1eb50 73 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61  sert( pCost->pla
1eb60 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28  n.u.pIdx==0 || (
1eb70 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1eb80 61 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f  ags&WHERE_ROWID_
1eb90 45 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  EQ)==0 );.  asse
1eba0 72 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  rt( pSrc->pIndex
1ebb0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
1ebc0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1ebd0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  x==0 .       || 
1ebe0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49  pCost->plan.u.pI
1ebf0 64 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  dx==pSrc->pIndex
1ec00 20 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54   .  );..  WHERET
1ec10 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65  RACE(("best inde
1ec20 78 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20  x is: %s\n", .  
1ec30 20 20 28 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e    ((pCost->plan.
1ec40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1ec50 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
1ec60 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20   ? "none" : .   
1ec70 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1ec80 6e 2e 75 2e 70 49 64 78 20 3f 20 70 43 6f 73 74  n.u.pIdx ? pCost
1ec90 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
1eca0 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20  Name : "ipk").  
1ecb0 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72 43  ));.  .  bestOrC
1ecc0 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73  lauseIndex(pPars
1ecd0 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
1ece0 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64  tReady, notValid
1ecf0 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
1ed00 74 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61  t);.  bestAutoma
1ed10 74 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ticIndex(pParse,
1ed20 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52   pWC, pSrc, notR
1ed30 65 61 64 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20  eady, pCost);.  
1ed40 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1ed50 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73  ags |= eqTermMas
1ed60 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  k;.}../*.** Find
1ed70 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
1ed80 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61  for accessing ta
1ed90 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20  ble pSrc->pTab. 
1eda0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73  Write the.** bes
1edb0 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64  t query plan and
1edc0 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74   its cost into t
1edd0 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a  he WhereCost obj
1ede0 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ect supplied .**
1edf0 20 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72   as the last par
1ee00 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ameter. This fun
1ee10 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c  ction may calcul
1ee20 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a  ate the cost of.
1ee30 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64  ** both real and
1ee40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
1ee50 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cans..*/.static 
1ee60 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a  void bestIndex(.
1ee70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee90 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1eea0 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
1eeb0 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
1eec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1eed0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1eee0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1eef0 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
1ef00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1ef10 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
1ef20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
1ef30 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
1ef40 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
1ef50 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1ef60 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20  or indexing */. 
1ef70 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69   Bitmask notVali
1ef80 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1ef90 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  Cursors not avai
1efa0 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75  lable for any pu
1efb0 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  rpose */.  ExprL
1efc0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
1efd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
1efe0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1eff0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
1f000 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
1f010 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
1f020 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23  ery plan */.){.#
1f030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f040 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1f050 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1f060 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20  pSrc->pTab) ){. 
1f070 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
1f080 5f 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20  _info *p = 0;.  
1f090 20 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64    bestVirtualInd
1f0a0 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
1f0b0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20  pSrc, notReady, 
1f0c0 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72  notValid, pOrder
1f0d0 42 79 2c 20 70 43 6f 73 74 2c 26 70 29 3b 0a 20  By, pCost,&p);. 
1f0e0 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f     if( p->needTo
1f0f0 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
1f100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f110 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  (p->idxStr);.   
1f120 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1f130 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1f140 20 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   p);.  }else.#en
1f150 64 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73 74  dif.  {.    best
1f160 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73  BtreeIndex(pPars
1f170 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f  e, pWC, pSrc, no
1f180 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64  tReady, notValid
1f190 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  , pOrderBy, 0, p
1f1a0 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Cost);.  }.}../*
1f1b0 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
1f1c0 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
1f1d0 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
1f1e0 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
1f1f0 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
1f200 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
1f210 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
1f220 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
1f230 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
1f240 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
1f250 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
1f260 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
1f270 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
1f280 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
1f290 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
1f2a0 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
1f2b0 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
1f2c0 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
1f2d0 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
1f2e0 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
1f2f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1f300 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
1f310 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
1f320 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
1f330 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1f340 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
1f350 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
1f360 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
1f370 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
1f380 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
1f390 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
1f3a0 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
1f3b0 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
1f3c0 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
1f3d0 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
1f3e0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
1f3f0 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
1f400 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
1f410 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
1f420 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
1f430 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
1f440 4f 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35  ON-OF: R-24597-5
1f450 38 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72  8655 No tests ar
1f460 65 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73  e done for terms
1f470 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d   that are.** com
1f480 70 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65  pletely satisfie
1f490 64 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a  d by indices..**
1f4a0 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
1f4b0 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
1f4c0 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
1f4d0 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
1f4e0 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
1f4f0 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
1f500 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
1f510 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
1f520 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
1f530 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
1f540 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
1f550 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
1f560 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
1f570 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
1f580 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
1f590 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
1f5a0 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
1f5b0 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
1f5c0 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
1f5d0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1f5e0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
1f5f0 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
1f600 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
1f610 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
1f620 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
1f630 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
1f640 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
1f650 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
1f660 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
1f670 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
1f680 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
1f690 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
1f6a0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
1f6b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
1f6c0 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
1f6d0 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   && (pTerm->wtFl
1f6e0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
1f6f0 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70  )==0.      && (p
1f700 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
1f710 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
1f720 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
1f730 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1f740 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72  )).  ){.    pTer
1f750 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
1f760 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
1f770 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
1f780 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
1f790 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
1f7a0 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
1f7b0 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
1f7c0 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
1f7d0 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
1f7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
1f7f0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1f800 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
1f810 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1f820 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41  .** Code an OP_A
1f830 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74  ffinity opcode t
1f840 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75  o apply the colu
1f850 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1f860 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68  ng zAff.** to th
1f870 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74  e n registers st
1f880 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20  arting at base. 
1f890 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74  .**.** As an opt
1f8a0 69 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54  imization, SQLIT
1f8b0 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
1f8c0 65 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f  es (which are no
1f8d0 2d 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20  -ops) at the.** 
1f8e0 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
1f8f0 64 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67  d of zAff are ig
1f900 6e 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65  nored.  If all e
1f910 6e 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61  ntries in zAff a
1f920 72 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  re.** SQLITE_AFF
1f930 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63  _NONE, then no c
1f940 6f 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74  ode gets generat
1f950 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1f960 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73  outine makes its
1f970 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66   own copy of zAf
1f980 66 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  f so that the ca
1f990 6c 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20  ller is free.** 
1f9a0 74 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61  to modify zAff a
1f9b0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
1f9c0 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  e returns..*/.st
1f9d0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70  atic void codeAp
1f9e0 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73  plyAffinity(Pars
1f9f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62  e *pParse, int b
1fa00 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  ase, int n, char
1fa10 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20   *zAff){.  Vdbe 
1fa20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1fa30 62 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d  be;.  if( zAff==
1fa40 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1fa50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1fa60 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1fa70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
1fa80 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
1fa90 20 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65    /* Adjust base
1faa0 20 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f   and n to skip o
1fab0 76 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ver SQLITE_AFF_N
1fac0 4f 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74  ONE entries at t
1fad0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
1fae0 2a 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  * and end of the
1faf0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1fb00 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
1fb10 6e 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d  n>0 && zAff[0]==
1fb20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
1fb30 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  ){.    n--;.    
1fb40 62 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66  base++;.    zAff
1fb50 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  ++;.  }.  while(
1fb60 20 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31   n>1 && zAff[n-1
1fb70 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ]==SQLITE_AFF_NO
1fb80 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20  NE ){.    n--;. 
1fb90 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68   }..  /* Code th
1fba0 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
1fbb0 63 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73  code if there is
1fbc0 20 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74   anything left t
1fbd0 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  o do. */.  if( n
1fbe0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
1fbf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fc00 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
1fc10 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
1fc20 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1fc30 20 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20   -1, zAff, n);. 
1fc40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1fc50 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1fc60 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
1fc70 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
1fc80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1fc90 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
1fca0 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
1fcb0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
1fcc0 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
1fcd0 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
1fce0 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
1fcf0 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
1fd00 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
1fd10 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
1fd20 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
1fd30 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
1fd40 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
1fd50 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1fd60 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
1fd70 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
1fd80 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
1fd90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1fda0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
1fdb0 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
1fdc0 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
1fdd0 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
1fde0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
1fdf0 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
1fe00 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
1fe10 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
1fe20 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
1fe30 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
1fe40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1fe50 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1fe60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1fe70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1fe80 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1fe90 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
1fea0 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
1feb0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1fec0 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
1fed0 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
1fee0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
1fef0 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
1ff00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
1ff10 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
1ff20 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
1ff30 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
1ff40 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
1ff50 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
1ff60 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
1ff70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
1ff80 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
1ff90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1ffa0 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffc0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1ffd0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
1ffe0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
1fff0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
20000 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
20010 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
20020 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
20030 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
20040 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
20050 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
20060 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
20070 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
20080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
200a0 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
200b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
200c0 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
200d0 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
200e0 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
200f0 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
20100 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
20110 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
20120 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
20130 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
20140 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
20150 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
20160 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62  pX, 0);.    iTab
20170 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
20180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20190 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
201a0 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
201b0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
201c0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
201d0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b  WHERE_IN_ABLE );
201e0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
201f0 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
20200 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
20210 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
20220 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20230 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
20240 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
20250 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
20260 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
20270 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
20280 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
20290 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
202a0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
202d0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
202e0 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
202f0 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
20300 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
20310 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
20320 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
20330 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
20340 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
20350 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
20360 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
20370 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
20380 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
20390 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
203a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
203b0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
203c0 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
203d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
203e0 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
203f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
20400 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
20410 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
20420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20440 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
20450 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
20460 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
20470 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
20480 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
20490 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
204a0 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
204b0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
204c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
204d0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
204e0 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
204f0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
20500 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
20510 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
20520 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
20530 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
20540 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
20550 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
20560 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
20570 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
20580 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
20590 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
205a0 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
205b0 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
205c0 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
205d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
205e0 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
205f0 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
20600 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
20610 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
20620 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
20630 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
20640 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
20650 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
20660 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
20670 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
20680 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
20690 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
206a0 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
206b0 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
206c0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
206d0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
206e0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
206f0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
20700 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
20710 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
20720 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
20730 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
20740 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
20750 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
20760 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
20770 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
20780 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
20790 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
207a0 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
207b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
207c0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
207d0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
207e0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
207f0 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
20800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20810 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
20820 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
20830 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
20840 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
20850 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
20860 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
20870 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
20880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
20890 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
208a0 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
208b0 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
208c0 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
208d0 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
208e0 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
208f0 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
20900 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
20910 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
20920 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
20930 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
20940 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
20950 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
20960 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
20970 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
20980 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
20990 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
209a0 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
209b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
209c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
209d0 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
209e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
209f0 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
20a00 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
20a10 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
20a20 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
20a30 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20a40 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
20a50 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
20a60 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
20a70 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
20a80 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
20a90 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
20aa0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
20ab0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
20ac0 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
20ad0 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
20ae0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
20af0 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
20b00 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
20b10 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
20b20 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
20b30 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
20b40 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
20b50 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
20b60 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
20b70 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
20b80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
20b90 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
20ba0 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
20bb0 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
20bc0 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
20bd0 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
20be0 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
20bf0 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
20c00 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
20c10 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
20c20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
20c30 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
20c40 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
20c50 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
20c60 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
20c70 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
20c80 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
20c90 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
20ca0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
20cb0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20cc0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
20cd0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
20ce0 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
20cf0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
20d00 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
20d10 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
20d20 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
20d30 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
20d40 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
20d50 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
20d60 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
20d70 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
20d80 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
20d90 69 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20  int nExtraReg,  
20da0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20db0 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
20dc0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
20dd0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66  /.  char **pzAff
20de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20df0 3a 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  : Set to point t
20e00 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
20e10 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  g */.){.  int nE
20e20 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  q = pLevel->plan
20e30 2e 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e  .nEq;   /* The n
20e40 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
20e50 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  N constraints to
20e60 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
20e70 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
20e80 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
20e90 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  vm under constru
20ea0 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
20eb0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
20ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20ed0 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64  index being used
20ee0 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a   for this loop *
20ef0 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
20f00 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20  Level->iTabCur; 
20f10 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
20f20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
20f30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
20f40 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
20f50 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  /* A single cons
20f60 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  traint term */. 
20f70 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f90 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20fa0 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
20fd0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  er */.  int nReg
20fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ff0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21000 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
21010 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
21020 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20  ar *zAff;       
21030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21040 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74  ffinity string t
21050 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
21060 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73  * This module is
21070 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20   only called on 
21080 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74  query plans that
21090 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a   use an index. *
210a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  /.  assert( pLev
210b0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
210c0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
210d0 20 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65   );.  pIdx = pLe
210e0 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
210f0 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
21100 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
21110 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
21120 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
21130 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
21140 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
21150 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
21160 52 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Reg = pLevel->pl
21170 61 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52  an.nEq + nExtraR
21180 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  eg;.  pParse->nM
21190 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a  em += nReg;..  z
211a0 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
211b0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
211c0 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  , sqlite3IndexAf
211d0 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
211e0 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66  x));.  if( !zAff
211f0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
21200 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21210 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
21220 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
21230 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
21240 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
21250 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
21260 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
21270 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
21280 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69     int r1;.    i
21290 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
212a0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
212b0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
212c0 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
212d0 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70  Ready, pLevel->p
212e0 6c 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64  lan.wsFlags, pId
212f0 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  x);.    if( NEVE
21300 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72  R(pTerm==0) ) br
21310 65 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  eak;.    /* The 
21320 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66  following true f
21330 6f 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20  or indices with 
21340 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
21350 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43  s. .    ** Ex: C
21360 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
21370 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c  N t1(a,b,a); SEL
21380 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
21390 45 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b  ERE a=0 AND b=0;
213a0 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
213b0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
213c0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21  s & TERM_CODED)!
213d0 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
213e0 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
213f0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
21400 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
21410 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
21420 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
21430 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
21440 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65  Term, pLevel, re
21450 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66  gBase+j);.    if
21460 28 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20  ( r1!=regBase+j 
21470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  ){.      if( nRe
21480 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  g==1 ){.        
21490 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
214a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
214b0 67 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  gBase);.        
214c0 72 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20  regBase = r1;.  
214d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
214e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
214f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
21500 2c 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29  , r1, regBase+j)
21510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
21530 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
21540 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
21550 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
21560 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
21570 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  O_IN );.    if( 
21580 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
21590 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
215a0 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
215b0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
215c0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
215d0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
215e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
215f0 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68  ullJump(v, pRigh
21600 74 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c  t, regBase+j, pL
21610 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
21620 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
21630 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
21640 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
21650 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
21660 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
21670 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
21680 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
21690 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
216a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
216c0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
216d0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
216e0 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
216f0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
21700 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
21710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21720 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
21730 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
21740 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
21750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21760 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
21770 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21780 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
21790 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
217a0 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
217b0 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
217c0 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
217d0 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
217e0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
217f0 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
21800 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
21810 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
21820 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
21830 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
21840 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
21850 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
21860 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
21870 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
21880 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
21890 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
218a0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
218b0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
218c0 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218e0 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
218f0 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
21900 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
21930 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
21940 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
21950 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
21960 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
21970 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
21980 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21990 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
219a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
219b0 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
219c0 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
219d0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
219e0 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
219f0 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
21a00 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
21a10 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a  , zColumn, -1);.
21a20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21a30 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f  mAppend(pStr, zO
21a40 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  p, 1);.  sqlite3
21a50 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
21a60 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a  Str, "?", 1);.}.
21a70 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
21a80 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73  pLevel describes
21a90 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20   a strategy for 
21aa0 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70  scanning table p
21ab0 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  Tab. This .** fu
21ac0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21ad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
21ae0 72 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74  ring buffer cont
21af0 61 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70  aining a descrip
21b00 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73  tion.** of the s
21b10 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72  ubset of table r
21b20 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ows scanned by t
21b30 68 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74  he strategy in t
21b40 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a  he form of an.**
21b50 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e   SQL expression.
21b60 20 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73   Or, if all rows
21b70 20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55   are scanned, NU
21b80 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
21b90 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
21ba0 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
21bb0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
21bc0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
21bd0 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
21be0 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
21bf0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
21c00 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
21c10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
21c20 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
21c30 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
21c40 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
21c50 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  >?".**.** The re
21c60 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70  turned pointer p
21c70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20  oints to memory 
21c80 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
21c90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
21ca0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
21cb0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
21cc0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
21cd0 65 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68  ee the buffer wh
21ce0 65 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c  en it is.** no l
21cf0 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
21d00 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
21d10 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
21d20 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
21d30 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
21d40 6c 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  l, Table *pTab){
21d50 0a 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70 50  .  WherePlan *pP
21d60 6c 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70  lan = &pLevel->p
21d70 6c 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  lan;.  Index *pI
21d80 6e 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e  ndex = pPlan->u.
21d90 70 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  pIdx;.  int nEq 
21da0 3d 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20  = pPlan->nEq;.  
21db0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75  int i, j;.  Colu
21dc0 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *aCol = pTab-
21dd0 3e 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69  >aCol;.  int *ai
21de0 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
21df0 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72  >aiColumn;.  Str
21e00 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66  Accum txt;..  if
21e10 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 50 6c  ( nEq==0 && (pPl
21e20 61 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57  an->wsFlags & (W
21e30 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
21e40 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
21e50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
21e60 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
21e70 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
21e80 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54  txt, 0, 0, SQLIT
21e90 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
21ea0 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20   txt.db = db;.  
21eb0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
21ec0 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22  ppend(&txt, " ("
21ed0 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 2);.  for(i=0;
21ee0 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20   i<nEq; i++){.  
21ef0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
21f00 65 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f  erm(&txt, i, aCo
21f10 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a  l[aiColumn[i]].z
21f20 4e 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a  Name, "=");.  }.
21f30 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20  .  j = i;.  if( 
21f40 70 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57  pPlan->wsFlags&W
21f50 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
21f60 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
21f70 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
21f80 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
21f90 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
21fa0 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
21fb0 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
21fc0 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22  (&txt, i++, z, "
21fd0 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  >");.  }.  if( p
21fe0 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48  Plan->wsFlags&WH
21ff0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
22000 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
22010 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  j==pIndex->nColu
22020 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn ) ? "rowid" :
22030 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a   aCol[aiColumn[j
22040 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78  ]].zName;.    ex
22050 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
22060 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29  &txt, i, z, "<")
22070 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
22080 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74  trAccumAppend(&t
22090 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72  xt, ")", 1);.  r
220a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
220b0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74  AccumFinish(&txt
220c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
220d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
220e0 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
220f0 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
22100 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
22110 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
22120 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 20  d. If the query 
22130 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69  being compiled i
22140 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  s an EXPLAIN QUE
22150 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c  RY PLAN, a singl
22160 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61  e.** record is a
22170 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  dded to the outp
22180 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  ut to describe t
22190 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74  he table scan st
221a0 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c  rategy in .** pL
221b0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
221c0 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
221d0 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  can(.  Parse *pP
221e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
221f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
22200 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
22210 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22230 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20  Table list this 
22240 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a  loop refers to *
22250 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
22260 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  pLevel,         
22270 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77      /* Scan to w
22280 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  rite OP_Explain 
22290 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20  opcode for */.  
222a0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
222d0 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  vel" column of o
222e0 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  utput */.  int i
222f0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
22300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
22310 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63  lue for "from" c
22320 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
22330 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
22340 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
22350 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
22360 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
22370 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29  hereBegin() */.)
22380 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
22390 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
223a0 20 20 75 33 32 20 66 6c 61 67 73 20 3d 20 70 4c    u32 flags = pL
223b0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
223c0 67 73 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  gs;.    struct S
223d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
223e0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
223f0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
22400 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
22410 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
22420 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20      /* VM being 
22430 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20  constructed */. 
22440 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
22450 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
22460 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
22470 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  dle */.    char 
22480 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20 20 20 20  *zMsg;          
22490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
224a0 20 74 6f 20 61 64 64 20 74 6f 20 45 51 50 20 6f   to add to EQP o
224b0 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 73 71 6c  utput */.    sql
224c0 69 74 65 33 5f 69 6e 74 36 34 20 6e 52 6f 77 3b  ite3_int64 nRow;
224d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
224e0 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
224f0 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
22500 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   scan */.    int
22510 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69   iId = pParse->i
22520 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65  SelectId;  /* Se
22530 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f  lect id (left-mo
22540 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  st output column
22550 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53  ) */.    int isS
22560 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
22570 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
22580 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c  or a SEARCH. Fal
22590 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a  se for SCAN. */.
225a0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
225b0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
225c0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
225d0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
225e0 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  LY) ) return;.. 
225f0 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 70     isSearch = (p
22600 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3e  Level->plan.nEq>
22610 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
22620 7c 7c 20 28 66 6c 61 67 73 26 28 57 48 45 52 45  || (flags&(WHERE
22630 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
22640 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a  _TOP_LIMIT))!=0.
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
22660 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
22670 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
22680 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
22690 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ));..    zMsg = 
226a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
226b0 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61 72 63  b, "%s", isSearc
226c0 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43 41 4e  h?"SEARCH":"SCAN
226d0 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
226e0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
226f0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22700 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22710 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55 45 52  Msg, "%s SUBQUER
22720 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49 74 65  Y %d", zMsg,pIte
22730 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
22740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22750 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
22760 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
22770 20 22 25 73 20 54 41 42 4c 45 20 25 73 22 2c 20   "%s TABLE %s", 
22780 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  zMsg, pItem->zNa
22790 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
227a0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
227b0 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  s ){.      zMsg 
227c0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
227d0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
227e0 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
227f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22800 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
22810 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
22820 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ED)!=0 ){.      
22830 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
22840 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
22850 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20 70 49 74  (db, pLevel, pIt
22860 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
22870 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22880 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22890 2c 20 22 25 73 20 55 53 49 4e 47 20 25 73 25 73  , "%s USING %s%s
228a0 49 4e 44 45 58 25 73 25 73 25 73 22 2c 20 7a 4d  INDEX%s%s%s", zM
228b0 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  sg, .          (
228c0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
228d0 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41 55 54 4f  EMP_INDEX)?"AUTO
228e0 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a 20 20 20  MATIC ":""),.   
228f0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20 26         ((flags &
22900 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
22910 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a 22 22 29  ?"COVERING ":"")
22920 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c  ,.          ((fl
22930 61 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  ags & WHERE_TEMP
22940 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20 22 29 2c  _INDEX)?"":" "),
22950 0a 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  .          ((fla
22960 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
22970 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c 65 76 65  INDEX)?"": pLeve
22980 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
22990 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
229a0 20 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29    zWhere.      )
229b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
229c0 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
229d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
229e0 20 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f   flags & (WHERE_
229f0 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
22a00 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
22a10 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
22a20 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
22a30 7a 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20  zMsg, "%s USING 
22a40 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
22a50 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20  KEY", zMsg);..  
22a60 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 57 48      if( flags&WH
22a70 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
22a80 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
22a90 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22aa0 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
22ab0 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
22ac0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22ad0 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
22ae0 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
22af0 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
22b00 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
22b10 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
22b20 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
22b30 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
22b40 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
22b50 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
22b60 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
22b70 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22b80 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22b90 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22ba0 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
22bb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
22bc0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 54  f( flags&WHERE_T
22bd0 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  OP_LIMIT ){.    
22be0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22bf0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22c00 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3c  Msg, "%s (rowid<
22c10 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
22c20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
22c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
22c40 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 65  RTUALTABLE.    e
22c50 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
22c60 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
22c70 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BLE)!=0 ){.     
22c80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
22c90 6e 66 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20  nfo *pVtabIdx = 
22ca0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
22cb0 56 74 61 62 49 64 78 3b 0a 20 20 20 20 20 20 7a  VtabIdx;.      z
22cc0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
22cd0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
22ce0 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  "%s VIRTUAL TABL
22cf0 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c 20  E INDEX %d:%s", 
22d00 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  zMsg,.          
22d10 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
22d20 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49  ->idxNum, pVtabI
22d30 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20  dx->idxStr);.   
22d40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
22d50 28 20 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48  ( wctrlFlags&(WH
22d60 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c  ERE_ORDERBY_MIN|
22d70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22d80 58 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  X) ){.      test
22d90 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
22da0 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
22db0 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20 20 6e 52  _MIN );.      nR
22dc0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ow = 1;.    }els
22dd0 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  e{.      nRow = 
22de0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
22df0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77  Level->plan.nRow
22e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 73 67  ;.    }.    zMsg
22e10 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
22e20 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
22e30 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29 22 2c 20   (~%lld rows)", 
22e40 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a 20 20 20  zMsg, nRow);.   
22e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22e60 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
22e70 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69  , iId, iLevel, i
22e80 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  From, zMsg, P4_D
22e90 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
22ea0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
22eb0 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
22ec0 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
22ed0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22ee0 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a  EXPLAIN */.../*.
22ef0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22f00 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
22f10 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20  f the iLevel-th 
22f20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52  loop in the WHER
22f30 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c  E clause.** impl
22f40 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72  ementation descr
22f50 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a  ibed by pWInfo..
22f60 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
22f70 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  k codeOneLoopSta
22f80 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  rt(.  WhereInfo 
22f90 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f  *pWInfo,   /* Co
22fa0 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69  mplete informati
22fb0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
22fc0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
22fd0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
22fe0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76      /* Which lev
22ff0 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b  el of pWInfo->a[
23000 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65  ] should be code
23010 64 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  d */.  u16 wctrl
23020 46 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f  Flags,      /* O
23030 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
23040 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
23050 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
23060 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
23070 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63  eady     /* Whic
23080 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72  h tables are cur
23090 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
230a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20   */.){.  int j, 
230b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
230c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
230d0 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
230e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
230f0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
23100 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
23110 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20  nt addrNxt;     
23120 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
23130 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65  jump to continue
23140 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
23150 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  N case */.  int 
23160 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20  omitTable;      
23170 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
23180 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
23190 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b  y */.  int bRev;
231a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
231b0 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
231c0 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
231d0 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65  e order */.  Whe
231e0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
231f0 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c    /* The where l
23200 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64  evel to be coded
23210 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
23220 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65  e *pWC;    /* De
23230 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  composition of t
23240 68 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20  he entire WHERE 
23250 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
23260 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
23270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23280 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
23290 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  rm */.  Parse *p
232a0 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
232b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
232c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
232d0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232f0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
23300 73 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  stmt under const
23310 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74  ructions */.  st
23320 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23330 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
23340 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
23350 6d 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  m being coded */
23360 0a 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20  .  int addrBrk; 
23370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23380 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
23390 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
233a0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
233b0 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20  t addrCont;     
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
233d0 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
233e0 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
233f0 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
23400 69 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20  iRowidReg = 0;  
23410 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
23420 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73  s stored in this
23430 20 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f   register, if no
23440 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  t zero */.  int 
23450 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b  iReleaseReg = 0;
23460 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
23470 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62  gister to free b
23480 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
23490 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
234a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
234b0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
234c0 62 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e  be;.  pWC = pWIn
234d0 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65  fo->pWC;.  pLeve
234e0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
234f0 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74  Level];.  pTabIt
23500 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  em = &pWInfo->pT
23510 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
23520 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72  ->iFrom];.  iCur
23530 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
23540 72 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28  rsor;.  bRev = (
23550 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
23560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
23570 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74  ERSE)!=0;.  omit
23580 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d  Table = (pLevel-
23590 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
235a0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
235b0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
235c0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
235d0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
235e0 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65  E)==0;..  /* Cre
235f0 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
23600 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
23610 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
23620 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20  ctions.  ** for 
23630 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
23640 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42  .  Jump to addrB
23650 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
23660 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  of a loop..  ** 
23670 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
23680 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
23690 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
236a0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
236b0 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   loop..  **.  **
236c0 20 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   When there is a
236d0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  n IN operator, w
236e0 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61  e also have a "a
236f0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68  ddrNxt" label th
23700 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  at.  ** means to
23710 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
23720 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
23730 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
23740 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61  hen.  ** there a
23750 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f  re no IN operato
23760 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  rs in the constr
23770 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72  aints, the "addr
23780 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20  Nxt" label.  ** 
23790 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
237a0 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20  addrBrk"..  */. 
237b0 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65   addrBrk = pLeve
237c0 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  l->addrBrk = pLe
237d0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73  vel->addrNxt = s
237e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
237f0 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f  bel(v);.  addrCo
23800 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  nt = pLevel->add
23810 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
23820 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23830 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
23840 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
23850 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
23860 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
23870 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61   and.  ** initia
23880 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
23890 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
238a0 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
238b0 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72  tches any.  ** r
238c0 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
238d0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
238e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  ..  */.  if( pLe
238f0 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
23900 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
23910 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
23920 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65  !=0 ){.    pLeve
23930 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
23940 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23960 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
23970 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 0, pLevel->i
23980 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56  LeftJoin);.    V
23990 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
239a0 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e  init LEFT JOIN n
239b0 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b  o-match flag"));
239c0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
239d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
239e0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
239f0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
23a00 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
23a10 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
23a20 20 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20      /* Case 0:  
23a30 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76  The table is a v
23a40 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55  irtual-table.  U
23a50 73 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61  se the VFilter a
23a60 6e 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20  nd VNext.    ** 
23a70 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65           to acce
23a80 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20  ss the data..   
23a90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67   */.    int iReg
23aa0 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
23ab0 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
23ac0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
23ad0 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49  dex_info *pVtabI
23ae0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
23af0 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20  n.u.pVtabIdx;.  
23b00 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
23b10 74 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43  t = pVtabIdx->nC
23b20 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73  onstraint;.    s
23b30 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
23b40 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
23b50 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20  sage *aUsage =. 
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 70                 p
23b90 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72  VtabIdx->aConstr
23ba0 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63  aintUsage;.    c
23bb0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
23bc0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
23bd0 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e  aint *aConstrain
23be0 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43      pVtabIdx->aC
23c20 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20  onstraint;..    
23c30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23c40 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23c50 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
23c60 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
23c70 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
23c80 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  +2);.    for(j=1
23c90 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
23ca0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
23cb0 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72  r(k=0; k<nConstr
23cc0 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  aint; k++){.    
23cd0 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b      if( aUsage[k
23ce0 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29  ].argvIndex==j )
23cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
23d00 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
23d10 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73  int[k].iTermOffs
23d20 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  et;.          sq
23d30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
23d40 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65  arse, pWC->a[iTe
23d50 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm].pExpr->pRigh
23d60 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20  t, iReg+j+1);.  
23d70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23d90 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43  .      if( k==nC
23da0 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
23db0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
23dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23dd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 56  , OP_Integer, pV
23de0 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  tabIdx->idxNum, 
23df0 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
23e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23e10 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c  OP_Integer, j-1,
23e20 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
23e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23e40 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
23e50 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 69 52  Cur, addrBrk, iR
23e60 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64  eg, pVtabIdx->id
23e70 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
23e80 20 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61              pVta
23e90 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  bIdx->needToFree
23ea0 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52 49  IdxStr ? P4_MPRI
23eb0 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29  NTF : P4_STATIC)
23ec0 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e  ;.    pVtabIdx->
23ed0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
23ee0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
23ef0 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; j<nConstraint
23f00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
23f10 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74  ( aUsage[j].omit
23f20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
23f30 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
23f40 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  int[j].iTermOffs
23f50 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  et;.        disa
23f60 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
23f70 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b  &pWC->a[iTerm]);
23f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23f90 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
23fa0 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
23fb0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
23fc0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
23fd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
23fe0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
23ff0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24000 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
24010 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
24020 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
24030 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
24040 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
24050 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
24060 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
24070 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
24080 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
24090 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
240a0 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20  ID_EQ ){.    /* 
240b0 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
240c0 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
240d0 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
240e0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
240f0 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74           equalit
24100 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
24110 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
24120 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a  ield.  Or.    **
24130 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
24140 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
24150 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
24160 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
24170 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
24180 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a  nstruct..    */.
24190 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20      iReleaseReg 
241a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
241b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
241c0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
241d0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
241e0 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
241f0 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20  |WO_IN, 0);.    
24200 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
24210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24220 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20  pTerm->pExpr!=0 
24230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24240 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
24250 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73  ==iCur );.    as
24260 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
24270 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
24280 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24290 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
242a0 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
242b0 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
242c0 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64   iRowidReg = cod
242d0 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
242e0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
242f0 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52 65 67  vel, iReleaseReg
24300 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d  );.    addrNxt =
24310 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
24320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
24330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
24340 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52  stBeInt, iRowidR
24350 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20  eg, addrNxt);.  
24360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24370 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
24380 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
24390 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
243a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
243b0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
243c0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
243d0 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65  idReg);.    Vdbe
243e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
243f0 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
24400 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
24410 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
24420 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
24430 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
24440 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  GE ){.    /* Cas
24450 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
24460 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
24470 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
24480 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
24490 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
244a0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
244b0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
244c0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
244d0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
244e0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
244f0 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
24500 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
24510 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   );.    pStart =
24520 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
24530 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
24540 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
24550 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 66  0);.    pEnd = f
24560 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
24570 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
24580 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
24590 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
245a0 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
245b0 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
245c0 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
245d0 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
245e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
245f0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
24600 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
24610 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
24620 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
24630 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
24640 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
24650 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
24660 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
24670 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
24680 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
24690 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
246a0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
246b0 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
246c0 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
246d0 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
246e0 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
246f0 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
24700 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
24710 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
24720 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
24730 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
24740 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
24750 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
24760 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGt,.          
24770 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
24780 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20  _SeekLe,.       
24790 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
247a0 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20   OP_SeekLt,.    
247b0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
247c0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20  */  OP_SeekGe.  
247d0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
247e0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
247f0 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
24800 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
24810 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
24820 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
24830 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
24840 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
24850 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
24860 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24870 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
24880 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
24890 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
248a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
248b0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
248c0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
248d0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
248e0 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20  -11662 */.      
248f0 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
24900 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
24910 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
24920 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
24930 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
24940 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
24950 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24960 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
24970 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
24980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24990 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
249a0 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
249b0 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
249c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
249d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
249e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
249f0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
24a00 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
24a10 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
24a20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24a30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
24a40 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
24a50 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
24a60 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
24a70 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24a80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
24a90 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
24aa0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
24ab0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
24ac0 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
24ad0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
24ae0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
24af0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
24b00 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
24b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
24b20 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
24b30 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74 65  iCur );.      te
24b40 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
24b50 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
24b60 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
24b70 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24b80 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
24b90 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
24ba0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
24bb0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24bc0 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
24bd0 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
24be0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
24bf0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
24c00 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
24c10 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
24c20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
24c30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24c40 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
24c50 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
24c60 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
24c70 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
24c80 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
24c90 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
24ca0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
24cb0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
24cc0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
24cd0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
24ce0 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
24cf0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
24d00 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
24d10 74 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  t;.    if( pStar
24d20 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 20  t==0 && pEnd==0 
24d30 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
24d40 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
24d50 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
24d60 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65  _STEP;.    }else
24d70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24d80 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b  pLevel->p5==0 );
24d90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
24da0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
24db0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
24dc0 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
24dd0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
24de0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
24df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24e00 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
24e10 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65  , iCur, iRowidRe
24e20 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
24e30 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
24e40 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31  pParse, iCur, -1
24e50 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
24e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24e70 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c  ddOp3(v, testOp,
24e80 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64   memEndValue, ad
24e90 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67  drBrk, iRowidReg
24ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24eb0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24ec0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
24ed0 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  IC | SQLITE_JUMP
24ee0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  IFNULL);.    }. 
24ef0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
24f00 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
24f10 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
24f20 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
24f30 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a  MN_EQ) ){.    /*
24f40 20 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20   Case 3: A scan 
24f50 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a  using an index..
24f60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
24f70 20 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20        The WHERE 
24f80 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61  clause may conta
24f90 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  in zero or more 
24fa0 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a  equality .    **
24fb0 20 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28           terms (
24fc0 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65  "==" or "IN" ope
24fd0 72 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66  rators) that ref
24fe0 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20  er to the N.    
24ff0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d  **         left-
25000 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  most columns of 
25010 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61  the index. It ma
25020 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20  y also contain. 
25030 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
25040 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25050 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f  ints (>, <, >= o
25060 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64  r <=) on the ind
25070 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  exed.    **     
25080 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20      column that 
25090 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
250a0 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69  ows the N equali
250b0 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20  ties. Only .    
250c0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72  **         the r
250d0 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
250e0 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
250f0 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
25100 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20   must.    **    
25110 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
25120 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
25130 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  tors. For exampl
25140 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a  e, if the .    *
25150 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
25160 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
25170 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
25180 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
25190 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  l .    **       
251a0 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20    optimized:.   
251b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
251c0 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a        x=5.    **
251d0 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
251e0 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20  AND y=10.    ** 
251f0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
25200 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
25210 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
25220 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20  D y>5 AND y<10. 
25230 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
25240 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44   x=5 AND y=5 AND
25250 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20   z<=10.    **.  
25260 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
25270 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68   z<10 term of th
25280 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e  e following cann
25290 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79  ot be used, only
252a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
252b0 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20  the x=5 term:.  
252c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
252d0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a         x=5 AND z
252e0 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <10.    **.    *
252f0 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20  *         N may 
25300 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  be zero if there
25310 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
25320 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
25330 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74   **         If t
25340 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71  here are no ineq
25350 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
25360 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74  ts, then N is at
25370 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25380 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a  least one..    *
25390 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
253a0 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c   This case is al
253b0 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  so used when the
253c0 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20  re are no WHERE 
253d0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20  clause.    **   
253e0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
253f0 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
25400 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
25410 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
25420 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f  **         to fo
25430 72 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  rce the output o
25440 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20  rder to conform 
25450 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a  to an ORDER BY..
25460 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 73 74 61      */  .    sta
25470 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74  tic const u8 aSt
25480 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
25490 20 20 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20    0,.      0,.  
254a0 20 20 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20      OP_Rewind,  
254b0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
254c0 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  !start_constrain
254d0 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26 26  ts && startEq &&
254e0 20 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20    !bRev) */.    
254f0 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20    OP_Last,      
25500 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73         /* 3: (!s
25510 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
25520 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
25530 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
25540 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20  OP_SeekGt,      
25550 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72       /* 4: (star
25560 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
25570 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62  & !startEq && !b
25580 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
25590 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20  _SeekLt,        
255a0 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f     /* 5: (start_
255b0 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
255c0 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65  !startEq &&  bRe
255d0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
255e0 65 65 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20  eekGe,          
255f0 20 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f   /* 6: (start_co
25600 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73  nstraints  &&  s
25610 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
25620 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
25630 6b 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  kLe            /
25640 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
25650 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
25660 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
25670 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 61  /.    };.    sta
25680 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
25690 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  dOp[] = {.      
256a0 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20  OP_Noop,        
256b0 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64       /* 0: (!end
256c0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f  _constraints) */
256d0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45 2c  .      OP_IdxGE,
256e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
256f0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
25700 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  ts && !bRev) */.
25710 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20        OP_IdxLT  
25720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a             /* 2:
25730 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
25740 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20  s && bRev) */.  
25750 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 45 71    };.    int nEq
25760 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
25770 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  nEq;  /* Number 
25780 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
25790 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d  s */.    int isM
257a0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
257b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
257c0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
257d0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
257e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42   */.    int regB
257f0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
25800 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
25810 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
25820 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
25830 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20  */.    int r1;  
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25850 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
25860 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72  ster */.    Wher
25870 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61  eTerm *pRangeSta
25880 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71  rt = 0;  /* Ineq
25890 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
258a0 74 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74  t at range start
258b0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
258c0 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30  m *pRangeEnd = 0
258d0 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69  ;    /* Inequali
258e0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
258f0 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20   range end */.  
25900 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25920 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
25930 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
25940 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69  = or <= */.    i
25950 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
25960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25970 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
25980 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
25990 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  <= */.    int st
259a0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b  art_constraints;
259b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
259c0 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73  of range is cons
259d0 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69  trained */.    i
259e0 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  nt nConstraint; 
259f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a00 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61  umber of constra
25a10 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  int terms */.   
25a20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a40 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69   The index we wi
25a50 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20  ll be using */. 
25a60 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
25a90 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
25aa0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   */.    int nExt
25ab0 72 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  raReg = 0;      
25ac0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25ad0 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
25ae0 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20  s needed */.    
25af0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b10 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f  Instruction opco
25b20 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  de */.    char *
25b30 7a 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20  zStartAff;      
25b40 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
25b50 74 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  ty for start of 
25b60 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
25b70 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   */.    char *zE
25b80 6e 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  ndAff;          
25b90 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
25ba0 20 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67   for end of rang
25bb0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
25bc0 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
25bd0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
25be0 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
25bf0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
25c00 20 20 20 20 6b 20 3d 20 28 6e 45 71 3d 3d 70 49      k = (nEq==pI
25c10 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31  dx->nColumn ? -1
25c20 20 3a 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   : pIdx->aiColum
25c30 6e 5b 6e 45 71 5d 29 3b 0a 0a 20 20 20 20 2f 2a  n[nEq]);..    /*
25c40 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
25c50 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
25c60 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
25c70 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
25c80 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
25c90 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
25ca0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
25cb0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
25cc0 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
25cd0 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
25ce0 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
25cf0 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
25d00 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
25d10 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
25d20 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
25d30 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
25d40 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
25d50 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
25d60 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
25d70 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
25d80 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
25d90 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
25da0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
25db0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25dc0 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
25dd0 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
25de0 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
25df0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
25e00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
25e10 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
25e20 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
25e30 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
25e40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
25e50 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20  ERE_ORDERBY).   
25e60 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
25e70 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
25e80 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
25e90 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
25ea0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
25eb0 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
25ec0 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
25ed0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
25ee0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
25ef0 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
25f00 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
25f10 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
25f20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
25f30 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
25f40 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
25f50 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
25f60 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
25f70 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
25f80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
25f90 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
25fa0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
25fb0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
25fc0 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
25fd0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
25fe0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
25ff0 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
26000 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
26010 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
26020 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
26030 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
26040 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
26050 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
26060 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
26070 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
26080 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
26090 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
260a0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
260b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
260c0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
260d0 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
260e0 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
260f0 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
26100 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
26110 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
26120 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
26130 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
26140 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
26150 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
26160 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
26170 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
26180 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  rms(.        pPa
26190 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43  rse, pLevel, pWC
261a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74  , notReady, nExt
261b0 72 61 52 65 67 2c 20 26 7a 53 74 61 72 74 41 66  raReg, &zStartAf
261c0 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 45 6e  f.    );.    zEn
261d0 64 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62  dAff = sqlite3Db
261e0 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
261f0 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
26200 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
26210 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
26220 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
26230 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
26240 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
26250 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
26260 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
26270 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
26280 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
26290 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
262a0 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
262b0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
262c0 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
262d0 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
262e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
262f0 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
26300 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
26310 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
26320 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
26330 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
26340 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
26350 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
26360 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
26370 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
26380 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
26390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
263a0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
263b0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
263c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
263d0 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _LE );.    testc
263e0 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
263f0 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d   && pRangeStart-
26400 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
26410 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
26420 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
26430 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
26440 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
26450 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
26460 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
26470 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
26480 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
26490 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
264a0 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
264b0 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
264c0 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
264d0 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
264e0 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
264f0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
26500 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
26510 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
26520 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
26530 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
26540 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
26550 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
26560 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
26570 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
26580 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
26590 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
265a0 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
265b0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
265c0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
265d0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
265e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
265f0 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
26600 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
26610 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
26620 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
26630 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
26640 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
26650 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
26660 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
26670 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
26680 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d  ddrNxt);.      }
26690 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72  .      if( zStar
266a0 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tAff ){.        
266b0 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  if( sqlite3Compa
266c0 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68  reAffinity(pRigh
266d0 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71  t, zStartAff[nEq
266e0 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
266f0 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ONE){.          
26700 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d  /* Since the com
26710 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65  parison is to be
26720 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20   performed with 
26730 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20  no conversions. 
26740 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
26750 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ied to the opera
26760 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66  nds, set the aff
26770 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74  inity to apply t
26780 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20  o pRight to .   
26790 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
267a0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
267b0 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41           zStartA
267c0 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45  ff[nEq] = SQLITE
267d0 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
267e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
267f0 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
26800 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
26810 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74  e(pRight, zStart
26820 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20  Aff[nEq]) ){.   
26830 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
26840 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
26850 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
26860 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20   }.      }  .   
26870 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b     nConstraint++
26880 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26890 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
268a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
268b0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20  RTUAL ); /* EV: 
268c0 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f  R-30575-11662 */
268d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
268e0 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20  sMinQuery ){.   
268f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26900 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
26910 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29   0, regBase+nEq)
26920 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  ;.      nConstra
26930 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61  int++;.      sta
26940 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  rtEq = 0;.      
26950 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26960 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
26970 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
26980 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
26990 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  se, nConstraint,
269a0 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
269b0 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
269c0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
269d0 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
269e0 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
269f0 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
26a00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26a10 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
26a20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
26a30 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
26a40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
26a50 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20  =OP_SeekGt );.  
26a60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
26a70 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20  OP_SeekGe );.   
26a80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
26a90 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20  P_SeekLe );.    
26aa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26ab0 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73  _SeekLt );.    s
26ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
26ad0 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Int(v, op, iIdxC
26ae0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67  ur, addrNxt, reg
26af0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
26b00 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  t);..    /* Load
26b10 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
26b20 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
26b30 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65 20  nstraint at the 
26b40 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
26b50 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29  * range (if any)
26b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f  ..    */.    nCo
26b70 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
26b80 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e      if( pRangeEn
26b90 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  d ){.      Expr 
26ba0 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65  *pRight = pRange
26bb0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
26bc0 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ht;.      sqlite
26bd0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
26be0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
26bf0 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  +nEq, 1);.      
26c00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
26c10 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
26c20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
26c30 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
26c40 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
26c50 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
26c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26c70 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
26c80 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
26c90 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
26ca0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
26cb0 20 20 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b    if( zEndAff ){
26cc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
26cd0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
26ce0 69 74 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64  ity(pRight, zEnd
26cf0 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54  Aff[nEq])==SQLIT
26d00 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20  E_AFF_NONE){.   
26d10 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
26d20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
26d30 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
26d40 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
26d50 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  sions.          
26d60 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68  ** applied to th
26d70 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
26d80 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
26d90 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
26da0 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to .          **
26db0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
26dc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26dd0 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53  zEndAff[nEq] = S
26de0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
26df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
26e10 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
26e20 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a  Change(pRight, z
26e30 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  EndAff[nEq]) ){.
26e40 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66            zEndAf
26e50 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
26e60 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
26e70 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
26e80 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
26e90 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
26ea0 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45  gBase, nEq+1, zE
26eb0 6e 64 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43  ndAff);.      nC
26ec0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
26ed0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26ee0 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
26ef0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
26f00 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35  ; /* EV: R-30575
26f10 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a  -11662 */.    }.
26f20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
26f30 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53  e(pParse->db, zS
26f40 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71  tartAff);.    sq
26f50 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
26f60 73 65 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29  se->db, zEndAff)
26f70 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;..    /* Top of
26f80 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a   the loop body *
26f90 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32  /.    pLevel->p2
26fa0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
26fb0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
26fc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
26fd0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
26fe0 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
26ff0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
27000 0a 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70  .    op = aEndOp
27010 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e  [(pRangeEnd || n
27020 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29  Eq) * (1 + bRev)
27030 5d 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ];.    testcase(
27040 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a   op==OP_Noop );.
27050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
27060 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20  ==OP_IdxGE );.  
27070 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27080 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
27090 69 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  if( op!=OP_Noop 
270a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
270b0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
270c0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
270d0 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
270e0 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
270f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
27100 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
27110 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20  !=bRev ?1:0);.  
27120 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
27130 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
27140 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
27150 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
27160 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
27170 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
27180 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75 61   that the inequa
27190 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69  lity contrains i
271a0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
271b0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
271c0 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
271d0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
271e0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
271f0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
27200 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
27210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
27220 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
27230 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c  gs & WHERE_BTM_L
27240 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74  IMIT );.    test
27250 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
27260 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27270 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a  RE_TOP_LIMIT );.
27280 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
27290 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
272a0 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
272b0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
272c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
272d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
272e0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
272f0 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29  IdxCur, nEq, r1)
27300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27310 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27320 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72  IsNull, r1, addr
27330 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
27340 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
27350 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
27360 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  1);..    /* Seek
27370 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
27380 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  r, if required *
27390 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  /.    disableTer
273a0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
273b0 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61  Start);.    disa
273c0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
273d0 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
273e0 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
273f0 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65  {.      iRowidRe
27400 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20  g = iReleaseReg 
27410 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27420 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
27430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27440 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
27450 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52  wid, iIdxCur, iR
27460 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
27470 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27480 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
27490 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
274a0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
274b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
274c0 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52  P_Seek, iCur, iR
274d0 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65  owidReg);  /* De
274e0 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20  ferred seek */. 
274f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
27500 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
27510 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
27520 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
27530 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
27540 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
27550 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
27560 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
27570 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
27580 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
27590 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
275a0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b   WHERE_UNIQUE ){
275b0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
275c0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
275d0 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
275e0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
275f0 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
27600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27610 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
27620 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
27630 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
27640 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  xCur;.  }else..#
27650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27660 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
27670 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  ON.  if( pLevel-
27680 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
27690 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29  WHERE_MULTI_OR )
276a0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a  {.    /* Case 4:
276b0 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65    Two or more se
276c0 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64  parately indexed
276d0 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
276e0 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20   by OR.    **.  
276f0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
27700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52    **.    **   CR
27710 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
27720 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20  b,c,d);.    **  
27730 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
27740 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a   ON t1(a);.    *
27750 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
27760 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20   i2 ON t1(b);.  
27770 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
27780 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b  DEX i3 ON t1(c);
27790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
277a0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
277b0 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62  1 WHERE a=5 OR b
277c0 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20  =7 OR (c=11 AND 
277d0 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20  d=13).    **.   
277e0 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70   ** In the examp
277f0 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  le, there are th
27800 72 65 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d  ree indexed term
27810 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f  s connected by O
27820 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f  R..    ** The to
27830 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f  p of the loop lo
27840 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  oks like this:. 
27850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27860 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
27870 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
27880 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
27890 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
278a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c   **.    ** Then,
278b0 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65   for each indexe
278c0 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c  d term, the foll
278d0 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d  owing. The argum
278e0 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52  ents to.    ** R
278f0 6f 77 53 65 74 54 65 73 74 20 61 72 65 20 73 75  owSetTest are su
27900 63 68 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  ch that the rowi
27910 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
27920 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64   row is inserted
27930 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
27940 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69   RowSet. If it i
27950 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
27960 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73  t, control skips
27970 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75   the.    ** Gosu
27980 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d  b opcode and jum
27990 70 73 20 73 74 72 61 69 67 68 74 20 74 6f 20 74  ps straight to t
279a0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
279b0 64 20 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e  d by WhereEnd().
279c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
279d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
279e0 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a  reBegin(<term>).
279f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
27a00 52 6f 77 53 65 74 54 65 73 74 20 20 20 20 20 20  RowSetTest      
27a10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 49 6e              # In
27a20 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20  sert rowid into 
27a30 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20  rowset.    **   
27a40 20 20 20 20 20 20 20 47 6f 73 75 62 20 20 20 20         Gosub    
27a50 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20    2 A.    **    
27a60 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
27a70 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20  End().    **.   
27a80 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** Following th
27a90 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f  e above, code to
27aa0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
27ab0 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68  oop. Label A, th
27ac0 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
27ad0 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f  of the Gosub abo
27ae0 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ve, jumps to the
27af0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67   instruction rig
27b00 68 74 20 61 66 74 65 72 20 74 68 65 20 47 6f 74  ht after the Got
27b10 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
27b20 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20            Null  
27b30 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
27b40 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65        # Zero the
27b50 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31   rowset in reg 1
27b60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
27b70 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20   Goto       B   
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 54               # T
27b90 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73  he loop is finis
27ba0 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  hed..    **.    
27bb0 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f  **       A: <loo
27bc0 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20  p body>         
27bd0 20 20 20 20 20 20 20 20 23 20 52 65 74 75 72 6e          # Return
27be0 20 64 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e   data, whatever.
27bf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27c00 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 20          Return  
27c10 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
27c20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20      # Jump back 
27c30 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20  to the Gosub.   
27c40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27c50 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c   B: <after the l
27c60 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop>.    **.    
27c70 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75  */.    WhereClau
27c80 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a  se *pOrWc;    /*
27c90 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62   The OR-clause b
27ca0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73  roken out into s
27cb0 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53  ubterms */.    S
27cc0 72 63 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20  rcList *pOrTab; 
27cd0 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e        /* Shorten
27ce0 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72  ed table list or
27cf0 20 4f 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72   OR-clause gener
27d00 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e  ation */..    in
27d10 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  t regReturn = ++
27d20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
27d30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
27d40 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50  ter used with OP
27d50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e  _Gosub */.    in
27d60 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b  t regRowset = 0;
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
27d90 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f  ter for RowSet o
27da0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
27db0 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20   regRowid = 0;  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
27de0 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64  er holding rowid
27df0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f   */.    int iLoo
27e00 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56  pBody = sqlite3V
27e10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
27e20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f    /* Start of lo
27e30 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69  op body */.    i
27e40 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20  nt iRetInit;    
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
27e70 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e  ess of regReturn
27e80 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74   init */.    int
27e90 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d   untestedTerms =
27ea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27eb0 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f  /* Some terms no
27ec0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73  t completely tes
27ed0 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ted */.    int i
27ee0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
27f10 0a 20 20 20 20 45 78 70 72 20 2a 70 41 6e 64 45  .    Expr *pAndE
27f20 78 70 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xpr = 0;        
27f30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 22 2e          /* An ".
27f40 2e 20 41 4e 44 20 28 2e 2e 2e 29 22 20 65 78 70  . AND (...)" exp
27f50 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 0a 20  ression */.   . 
27f60 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65     pTerm = pLeve
27f70 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b  l->plan.u.pTerm;
27f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
27f90 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
27fa0 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
27fb0 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a  rator==WO_OR );.
27fc0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
27fd0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
27fe0 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
27ff0 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
28000 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
28010 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
28020 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
28030 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
28040 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
28050 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
28060 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54   SrcList ni pOrT
28070 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
28080 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
28090 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
280a0 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
280b0 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
280c0 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
280d0 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
280e0 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
280f0 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
28100 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
28110 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
28120 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
28130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28140 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
28150 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
28160 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
28170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28180 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
28190 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
281a0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
281b0 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
281c0 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
281d0 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
281e0 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
281f0 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
28200 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
28210 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
28220 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
28230 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
28240 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
28260 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
28270 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
28280 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
28290 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
282a0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
282b0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
282c0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
282d0 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
282e0 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
282f0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
28300 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
28310 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
28320 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
28330 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
28340 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
28350 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28360 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
28370 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
28380 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
28390 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
283a0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
283b0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
283c0 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
283d0 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
283e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
283f0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
28400 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
28410 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
28420 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
28430 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
28440 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
28450 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
28460 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
28470 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
28480 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
28490 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
284a0 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
284b0 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
284c0 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
284d0 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
284e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
284f0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
28500 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
28510 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
28520 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
28530 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
28540 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
28550 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
28560 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
28570 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
28580 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
28590 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
285a0 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
285b0 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
285c0 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
285d0 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
285e0 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
285f0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
28600 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
28610 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
28620 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
28630 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
28640 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
28650 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
28660 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
28670 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
28680 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
28690 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
286a0 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
286b0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
286c0 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
286d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
286e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
286f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28700 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
28710 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
28720 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
28730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28740 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
28750 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
28760 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
28770 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
28780 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
28790 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
287a0 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
287b0 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
287c0 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
287d0 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
287e0 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
287f0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
28800 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
28810 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
28820 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
28830 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
28840 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
28850 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
28860 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
28870 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
28880 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
28890 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
288a0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
288b0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
288c0 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
288d0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
288e0 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
288f0 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
28900 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
28910 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
28920 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
28930 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
28940 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
28950 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
28960 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
28970 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
28980 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 31  if( pWC->nTerm>1
28990 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
289a0 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  erm;.      for(i
289b0 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d 3c 70 57  Term=0; iTerm<pW
289c0 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65 72 6d 2b  C->nTerm; iTerm+
289d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
289e0 20 2a 70 45 78 70 72 20 3d 20 70 57 43 2d 3e 61   *pExpr = pWC->a
289f0 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 3b 0a 20  [iTerm].pExpr;. 
28a00 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
28a10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
28a20 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
28a30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28a40 20 20 20 69 66 28 20 70 57 43 2d 3e 61 5b 69 54     if( pWC->a[iT
28a50 65 72 6d 5d 2e 77 74 46 6c 61 67 73 20 26 20 28  erm].wtFlags & (
28a60 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
28a70 4d 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74  M_ORINFO) ) cont
28a80 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
28a90 28 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  ( (pWC->a[iTerm]
28aa0 2e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  .eOperator & WO_
28ab0 41 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ALL)==0 ) contin
28ac0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ue;.        pExp
28ad0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
28ae0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
28af0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
28b00 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
28b10 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
28b20 73 65 2d 3e 64 62 2c 20 70 41 6e 64 45 78 70 72  se->db, pAndExpr
28b30 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
28b40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64  }.      if( pAnd
28b50 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
28b60 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
28b70 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
28b80 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45  TK_AND, 0, pAndE
28b90 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
28ba0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
28bb0 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e  ii=0; ii<pOrWc->
28bc0 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  nTerm; ii++){.  
28bd0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
28be0 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d  OrTerm = &pOrWc-
28bf0 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66  >a[ii];.      if
28c00 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
28c10 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 70  ursor==iCur || p
28c20 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
28c30 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20  r==WO_AND ){.   
28c40 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a       WhereInfo *
28c50 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20  pSubWInfo;      
28c60 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20      /* Info for 
28c70 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73  single OR-term s
28c80 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  can */.        E
28c90 78 70 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70  xpr *pOrExpr = p
28ca0 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20  OrTerm->pExpr;. 
28cb0 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
28cc0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
28cd0 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74   pAndExpr->pLeft
28ce0 20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20   = pOrExpr;.    
28cf0 20 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20        pOrExpr = 
28d00 70 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20  pAndExpr;.      
28d10 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c    }.        /* L
28d20 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
28d30 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
28d40 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
28d50 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  m. */.        pS
28d60 75 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  ubWInfo = sqlite
28d70 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
28d80 73 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45  se, pOrTab, pOrE
28d90 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  xpr, 0, 0,.     
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50     WHERE_OMIT_OP
28dc0 45 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45  EN_CLOSE | WHERE
28dd0 5f 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20  _AND_ONLY |.    
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f      WHERE_FORCE_
28e00 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e  TABLE | WHERE_ON
28e10 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20  ETABLE_ONLY);.  
28e20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
28e30 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
28e40 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
28e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28e60 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26  Parse, pOrTab, &
28e70 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  pSubWInfo->a[0],
28e80 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d   iLevel, pLevel-
28e90 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20  >iFrom, 0.      
28ea0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
28eb0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
28ec0 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
28ed0 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
28ee0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
28ef0 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
28f00 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
28f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28f20 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
28f30 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
28f40 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
28f50 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
28f60 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c  >pTab, -1, iCur,
28f70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f             regRo
28fa0 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
28fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28fc0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
28fd0 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
28fe0 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  owset,.         
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
29010 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
29020 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20  )+2, r, iSet);. 
29030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
29060 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
29070 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
29080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
29090 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
290a0 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
290b0 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
290c0 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
290d0 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
290e0 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
290f0 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
29100 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
29110 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
29120 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
29130 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
29140 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
29150 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
29160 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
29170 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
29180 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
29190 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
291a0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
291b0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
291c0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
291d0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
291e0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
291f0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
29200 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
29210 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
29220 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
29230 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
29240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
29250 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70 72      if( pAndExpr
29260 20 29 7b 0a 20 20 20 20 20 20 70 41 6e 64 45 78   ){.      pAndEx
29270 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
29280 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29290 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
292a0 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a 20 20  b, pAndExpr);.  
292b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
292c0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 69  dbeChangeP1(v, i
292d0 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65 33  RetInit, sqlite3
292e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
292f0 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
29300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
29310 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
29320 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
29330 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
29340 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70  veLabel(v, iLoop
29350 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66 28 20  Body);..    if( 
29360 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31  pWInfo->nLevel>1
29370 20 29 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46   ) sqlite3StackF
29380 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
29390 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69 66 28  pOrTab);.    if(
293a0 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20   !untestedTerms 
293b0 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c  ) disableTerm(pL
293c0 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
293d0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
293e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
293f0 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
29400 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20    {.    /* Case 
29410 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  5:  There is no 
29420 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
29430 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
29440 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lete.    **     
29450 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
29460 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
29470 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
29480 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65 70 5b   const u8 aStep[
29490 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f  ] = { OP_Next, O
294a0 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20 73 74  P_Prev };.    st
294b0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
294c0 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65  tart[] = { OP_Re
294d0 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b  wind, OP_Last };
294e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65  .    assert( bRe
294f0 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20  v==0 || bRev==1 
29500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
29510 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
29520 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
29530 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
29540 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
29550 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
29560 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
29570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
29580 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
29590 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
295a0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
295b0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
295c0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
295d0 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20  }.  notReady &= 
295e0 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d  ~getMask(pWC->pM
295f0 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a  askSet, iCur);..
29600 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65    /* Insert code
29610 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73   to test every s
29620 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ubexpression tha
29630 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74  t can be complet
29640 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65  ely.  ** compute
29650 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
29660 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
29670 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50  s..  **.  ** IMP
29680 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
29690 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20 54 65  R-49525-50935 Te
296a0 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  rms that cannot 
296b0 62 65 20 73 61 74 69 73 66 69 65 64 20 74 68 72  be satisfied thr
296c0 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 75 73  ough.  ** the us
296d0 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62 65 63  e of indices bec
296e0 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74 20 61  ome tests that a
296f0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  re evaluated aga
29700 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20 6f 66  inst each row of
29710 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65 76 61  .  ** the releva
29720 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65 73 2e  nt input tables.
29730 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
29740 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
29750 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
29760 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
29770 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
29780 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
29790 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
297a0 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d 50 3a  RTUAL ); /* IMP:
297b0 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
297c0 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  /.    testcase( 
297d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
297e0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
297f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
29800 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
29810 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
29820 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
29830 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
29840 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
29850 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
29860 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
29870 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 3d  ->untestedTerms=
29880 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
29890 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
298a0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
298b0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 21  _ONETABLE_ONLY)!
298c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
298d0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
298e0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  s = 1;.      con
298f0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
29900 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pE = pTerm->pEx
29910 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
29920 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pE!=0 );.    if(
29930 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
29940 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72  in && !ExprHasPr
29950 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72  operty(pE, EP_Fr
29960 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
29970 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
29980 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29990 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
299a0 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
299b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
299c0 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
299d0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
299e0 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ED;.  }..  /* Fo
299f0 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
29a00 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
29a10 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
29a20 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
29a30 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
29a40 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
29a50 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
29a60 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
29a70 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
29a80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
29a90 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
29aa0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
29ab0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
29ac0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
29ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
29ae0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
29af0 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
29b00 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
29b10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
29b20 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
29b30 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
29b40 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
29b50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
29b60 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
29b70 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
29b80 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
29b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
29ba0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
29bb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
29bc0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35  ;  /* IMP: R-305
29bd0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
29be0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
29bf0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
29c00 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20  M_CODED );.     
29c10 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
29c20 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
29c30 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
29c40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29c50 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
29c60 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
29c70 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
29c80 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
29c90 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
29ca0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
29cb0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
29cc0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
29cd0 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
29ce0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
29cf0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
29d00 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
29d10 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
29d20 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
29d30 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
29d40 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
29d50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
29d60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
29d70 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
29d80 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f  g);..  return no
29d90 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 20 64  tReady;.}..#if d
29da0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
29db0 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ST)./*.** The fo
29dc0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
29dd0 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65   holds a text de
29de0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65  scription of que
29df0 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65  ry plan generate
29e00 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74  d.** by the most
29e10 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
29e20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29e30 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  n().  Each call 
29e40 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a  to WhereBegin.**
29e50 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
29e60 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20  previous.  This 
29e70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
29e80 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
29e90 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  and.** analysis 
29ea0 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  only..*/.char sq
29eb0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
29ec0 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20  [BMS*2*40];  /* 
29ed0 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  Text of the join
29ee0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
29ef0 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20  QPlan = 0;      
29f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
29f10 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75  free slow in _qu
29f20 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23  ery_plan[] */..#
29f30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
29f40 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
29f50 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
29f60 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
29f70 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
29f80 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20  nfoFree(sqlite3 
29f90 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a  *db, WhereInfo *
29fa0 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41  pWInfo){.  if( A
29fb0 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b  LWAYS(pWInfo) ){
29fc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
29fd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
29fe0 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
29ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
2a000 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
2a010 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
2a020 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
2a030 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
2a040 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
2a050 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
2a060 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64 62  eIdxStr==0 || db
2a070 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2a080 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ; */.        if(
2a090 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
2a0a0 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20  eeIdxStr ){.    
2a0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a0c0 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
2a0d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a0e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2a0f0 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a 20  ee(db, pInfo);. 
2a100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a110 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c   pWInfo->a[i].pl
2a120 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2a130 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 7b  RE_TEMP_INDEX ){
2a140 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2a150 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  pIdx = pWInfo->a
2a160 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  [i].plan.u.pIdx;
2a170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
2a180 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  x ){.          s
2a190 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2a1a0 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b   pIdx->zColAff);
2a1b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2a1c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64  e3DbFree(db, pId
2a1d0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
2a1e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2a1f0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
2a200 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20  (pWInfo->pWC);. 
2a210 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2a220 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
2a230 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
2a240 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
2a250 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
2a260 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
2a270 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2a280 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2a290 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
2a2a0 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
2a2b0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
2a2c0 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
2a2d0 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
2a2e0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
2a2f0 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
2a300 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
2a310 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
2a320 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2a330 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
2a340 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
2a350 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
2a360 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
2a370 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
2a380 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
2a390 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2a3a0 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
2a3b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
2a3c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
2a3d0 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
2a3e0 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
2a3f0 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
2a400 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
2a410 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2a420 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
2a430 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2a440 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
2a450 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
2a460 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
2a470 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
2a480 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a490 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
2a4a0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
2a4b0 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
2a4c0 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2a4d0 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
2a4e0 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
2a4f0 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
2a500 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
2a510 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
2a520 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2a530 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
2a540 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
2a550 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2a560 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2a570 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
2a580 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
2a590 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
2a5a0 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
2a5b0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
2a5c0 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
2a5d0 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
2a5e0 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
2a610 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
2a620 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
2a630 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
2a640 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
2a650 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
2a680 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c   Note that the l
2a690 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  oops might not b
2a6a0 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20  e nested in the 
2a6b0 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  order in which t
2a6c0 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e  hey.** appear in
2a6d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a6e0 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20   if a different 
2a6f0 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20  order is better 
2a700 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  able to make.** 
2a710 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
2a720 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
2a730 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72  when the IN oper
2a740 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a  ator appears in.
2a750 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
2a760 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65  use, it might re
2a770 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e  sult in addition
2a780 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20  al nested loops 
2a790 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20  for.** scanning 
2a7a0 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75  through all valu
2a7b0 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  es on the right-
2a7c0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
2a7d0 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   IN..**.** There
2a7e0 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f   are Btree curso
2a7f0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
2a800 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20  th each table.  
2a810 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a  t1 uses cursor.*
2a820 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73  * number pTabLis
2a830 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e  t->a[0].iCursor.
2a840 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75    t2 uses the cu
2a850 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  rsor pTabList->a
2a860 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20  [1].iCursor..** 
2a870 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54  And so forth.  T
2a880 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
2a890 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70  rates code to op
2a8a0 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75  en those VDBE cu
2a8b0 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c  rsors.** and sql
2a8c0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67  ite3WhereEnd() g
2a8d0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
2a8e0 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e  e to close them.
2a8f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
2a900 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72  that sqlite3Wher
2a910 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74  eBegin() generat
2a920 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  es leaves the cu
2a930 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69  rsors named.** i
2a940 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74  n pTabList point
2a950 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70  ing at their app
2a960 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73  ropriate entries
2a970 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64  .  The [...] cod
2a980 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f  e.** can use OP_
2a990 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f  Column and OP_Ro
2a9a0 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  wid opcodes on t
2a9b0 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20  hese cursors to 
2a9c0 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20  extract.** data 
2a9d0 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73  from the various
2a9e0 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c   tables of the l
2a9f0 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  oop..**.** If th
2aa00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2aa10 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72  s empty, the for
2aa20 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20  each loops must 
2aa30 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a  each scan their.
2aa40 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73  ** entire tables
2aa50 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d  .  Thus a three-
2aa60 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f  way join is an O
2aa70 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e  (N^3) operation.
2aa80 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20    But if.** the 
2aa90 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69  tables have indi
2aaa0 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72  ces and there ar
2aab0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57  e terms in the W
2aac0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2aad0 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f  .** refer to tho
2aae0 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f  se indices, a co
2aaf0 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61  mplete table sca
2ab00 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64  n can be avoided
2ab10 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65   and the.** code
2ab20 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66   will run much f
2ab30 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20  aster.  Most of 
2ab40 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73  the work of this
2ab50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63   routine is chec
2ab60 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69  king.** to see i
2ab70 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69  f there are indi
2ab80 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  ces that can be 
2ab90 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70  used to speed up
2aba0 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
2abb0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   Terms of the WH
2abc0 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61  ERE clause are a
2abd0 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69  lso used to limi
2abe0 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74  t which rows act
2abf0 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74  ually.** make it
2ac00 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e   to the "..." in
2ac10 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74   the middle of t
2ac20 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20  he loop.  After 
2ac30 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a  each "foreach",.
2ac40 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ** terms of the 
2ac50 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2ac60 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73  t use only terms
2ac70 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e   in that loop an
2ac80 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73  d outer.** loops
2ac90 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
2aca0 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75  nd if false a ju
2acb0 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e  mp is made aroun
2acc0 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  d all subsequent
2acd0 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20  .** inner loops 
2ace0 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22  (or around the "
2acf0 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74  ..." if the test
2ad00 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
2ad10 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73  he inner-.** mos
2ad20 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55  t loop).**.** OU
2ad30 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20  TER JOINS.**.** 
2ad40 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66  An outer join of
2ad50 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74   tables t1 and t
2ad60 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79  2 is conceptally
2ad70 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77   coded as follow
2ad80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65  s:.**.**    fore
2ad90 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
2ada0 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d  o.**      flag =
2adb0 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61   0.**      forea
2adc0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
2add0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74  .**        start
2ade0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e  :.**          ..
2adf0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c  ..**          fl
2ae00 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65  ag = 1.**      e
2ae10 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c  nd.**      if fl
2ae20 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20  ag==0 then.**   
2ae30 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f       move the ro
2ae40 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e  w2 cursor to a n
2ae50 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20  ull row.**      
2ae60 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20    goto start.** 
2ae70 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e       fi.**    en
2ae80 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  d.**.** ORDER BY
2ae90 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49   CLAUSE PROCESSI
2aea0 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65  NG.**.** *ppOrde
2aeb0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
2aec0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
2aed0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
2aee0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
2aef0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
2af00 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  e.  If there is 
2af10 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
2af20 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  se or if this ro
2af30 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2af40 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54  ed from an UPDAT
2af50 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
2af60 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72  ement, then ppOr
2af70 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
2af80 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78  *.** If an index
2af90 20 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20   can be used so 
2afa0 74 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c  that the natural
2afb0 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66   output order of
2afc0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63   the table.** sc
2afd0 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f  an is correct fo
2afe0 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
2aff0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74  lause, then that
2b000 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61   index is used a
2b010 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  nd.** *ppOrderBy
2b020 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
2b030 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
2b040 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70  imization that p
2b050 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e  revents an.** un
2b060 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f  necessary sort o
2b070 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
2b080 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70   if an index app
2b090 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
2b0a0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
2b0b0 75 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  use already exis
2b0c0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
2b0d0 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f   where clause lo
2b0e0 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72  ops cannot be ar
2b0f0 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64  ranged to provid
2b100 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
2b110 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74   output order, t
2b120 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72  hen the *ppOrder
2b130 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  By is unchanged.
2b140 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73  .*/.WhereInfo *s
2b150 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2b160 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2b170 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
2b180 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2b190 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2b1a0 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20  abList,    /* A 
2b1b0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
2b1c0 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
2b1d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2b1e0 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
2b1f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2b200 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
2b210 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e  ppOrderBy, /* An
2b220 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2b230 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  , or NULL */.  E
2b240 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e  xprList *pDistin
2b250 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65 6c 65  ct,  /* The sele
2b260 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49 53 54  ct-list for DIST
2b270 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d 20 6f  INCT queries - o
2b280 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20  r NULL */.  u16 
2b290 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
2b2a0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
2b2b0 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
2b2c0 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
2b2d0 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nt.h */.){.  int
2b2e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2b2f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2b300 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2b310 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
2b320 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
2b330 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
2b340 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
2b350 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ruct */.  int nT
2b360 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2b370 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b380 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54  f elements in pT
2b390 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
2b3a0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2b3b0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
2b3c0 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
2b3d0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
2b3e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
2b3f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2b400 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
2b410 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
2b420 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d  engine */.  Bitm
2b430 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20  ask notReady;   
2b440 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
2b450 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79  s that are not y
2b460 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f  et positioned */
2b470 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
2b480 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a  *pMaskSet;    /*
2b490 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
2b4a0 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68  mask set */.  Wh
2b4b0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b4d0 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
2b4e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2b4f0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
2b500 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
2b510 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e  bItem;  /* A sin
2b520 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70  gle entry from p
2b530 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
2b540 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b560 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
2b570 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73  n the pWInfo lis
2b580 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
2b590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b5a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2b5b0 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75  unused FROM clau
2b5c0 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  se element */.  
2b5d0 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20  int andFlags;   
2b5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e             /* AN
2b5f0 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  D-ed combination
2b600 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d   of all pWC->a[]
2b610 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71  .wtFlags */.  sq
2b620 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
2b630 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b640 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2b650 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  */..  /* The num
2b660 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
2b670 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b680 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
2b690 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
2b6a0 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
2b6b0 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ask .  */.  test
2b6c0 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e  case( pTabList->
2b6d0 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69  nSrc==BMS );.  i
2b6e0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
2b6f0 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
2b700 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b710 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
2b720 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
2b730 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
2b740 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2b750 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2b760 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74  normally generat
2b770 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  es a nested loop
2b780 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
2b790 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73  in .  ** pTabLis
2b7a0 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 57  t.  But if the W
2b7b0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2b7c0 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  LY flag is set, 
2b7d0 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
2b7e0 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
2b7f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
2b800 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
2b810 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
2b820 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
2b830 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
2b840 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
2b850 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
2b860 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2b870 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
2b880 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b890 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
2b8a0 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74  ) ? 1 : pTabList
2b8b0 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c  ->nSrc;..  /* Al
2b8c0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
2b8d0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
2b8e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2b8f0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
2b900 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
2b910 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61  alue. A single a
2b920 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65  llocation is use
2b930 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57  d to store the W
2b940 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74  hereInfo.  ** st
2b950 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e  ruct, the conten
2b960 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e  ts of WhereInfo.
2b970 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c  a[], the WhereCl
2b980 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  ause structure. 
2b990 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72   ** and the Wher
2b9a0 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  eMaskSet structu
2b9b0 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43  re. Since WhereC
2b9c0 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
2b9d0 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69  n 8-byte.  ** fi
2b9e0 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73  eld (type Bitmas
2b9f0 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c  k) it must be al
2ba00 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79  igned on an 8-by
2ba10 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20  te boundary on. 
2ba20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65   ** some archite
2ba30 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68  ctures. Hence th
2ba40 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77  e ROUND8() below
2ba50 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  ..  */.  db = pP
2ba60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74  arse->db;.  nByt
2ba70 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28  eWInfo = ROUND8(
2ba80 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
2ba90 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73  )+(nTabList-1)*s
2baa0 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
2bab0 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  ));.  pWInfo = s
2bac0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2bad0 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 6e 42  ro(db, .      nB
2bae0 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20  yteWInfo + .    
2baf0 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 43 6c    sizeof(WhereCl
2bb00 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20 73 69  ause) +.      si
2bb10 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b 53 65  zeof(WhereMaskSe
2bb20 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  t).  );.  if( db
2bb30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2bb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2bb50 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
2bb60 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b  .    pWInfo = 0;
2bb70 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2bb80 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20  eginError;.  }. 
2bb90 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
2bba0 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
2bbb0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
2bbc0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
2bbd0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
2bbe0 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
2bbf0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
2bc00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2bc10 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43 20  ;.  pWInfo->pWC 
2bc20 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43 6c  = pWC = (WhereCl
2bc30 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29 70  ause *)&((u8 *)p
2bc40 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e 66  WInfo)[nByteWInf
2bc50 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63  o];.  pWInfo->wc
2bc60 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c  trlFlags = wctrl
2bc70 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d  Flags;.  pWInfo-
2bc80 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70  >savedNQueryLoop
2bc90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
2bca0 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b 53 65  yLoop;.  pMaskSe
2bcb0 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53 65  t = (WhereMaskSe
2bcc0 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f  t*)&pWC[1];..  /
2bcd0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
2bce0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
2bcf0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
2bd00 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
2bd10 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
2bd20 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
2bd30 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2bd40 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
2bd50 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  /.  if( db->flag
2bd60 73 20 26 20 53 51 4c 49 54 45 5f 44 69 73 74 69  s & SQLITE_Disti
2bd70 6e 63 74 4f 70 74 20 29 20 70 44 69 73 74 69 6e  nctOpt ) pDistin
2bd80 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70  ct = 0;..  /* Sp
2bd90 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
2bda0 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
2bdb0 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
2bdc0 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
2bdd0 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
2bde0 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
2bdf0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
2be00 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
2be10 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
2be20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
2be30 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70 4d  (pWC, pParse, pM
2be40 61 73 6b 53 65 74 2c 20 77 63 74 72 6c 46 6c 61  askSet, wctrlFla
2be50 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  gs);.  sqlite3Ex
2be60 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
2be70 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
2be80 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57  .  whereSplit(pW
2be90 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
2bea0 44 29 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  D);   /* IMP: R-
2beb0 31 35 38 34 32 2d 35 33 32 39 36 20 2a 2f 0a 20  15842-53296 */. 
2bec0 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
2bed0 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
2bee0 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
2bef0 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
2bf00 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
2bf10 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
2bf20 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
2bf30 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
2bf40 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
2bf50 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e  if( pWhere && (n
2bf60 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71  TabList==0 || sq
2bf70 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2bf80 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72  antNotJoin(pWher
2bf90 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e)) ){.    sqlit
2bfa0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2bfb0 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57  arse, pWhere, pW
2bfc0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51  Info->iBreak, SQ
2bfd0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2bfe0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  ;.    pWhere = 0
2bff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69  ;.  }..  /* Assi
2c000 67 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68  gn a bit from th
2c010 65 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65  e bitmask to eve
2c020 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ry term in the F
2c030 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
2c040 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67  .  ** When assig
2c050 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c  ning bitmask val
2c060 75 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75  ues to FROM clau
2c070 73 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d  se cursors, it m
2c080 75 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20  ust be.  ** the 
2c090 63 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69  case that if X i
2c0a0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
2c0b0 72 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20  r the N-th FROM 
2c0c0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e  clause term then
2c0d0 0a 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  .  ** the bitmas
2c0e0 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63  k for all FROM c
2c0f0 6c 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74  lause terms to t
2c100 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e  he left of the N
2c110 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73  -th term.  ** is
2c120 20 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70   (X-1).   An exp
2c130 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
2c140 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
2c150 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73  LEFT JOIN can us
2c160 65 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e  e.  ** its Expr.
2c170 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2c180 76 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68  value to find th
2c190 65 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  e bitmask of the
2c1a0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a   right table.  *
2c1b0 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
2c1c0 53 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20  Subtracting one 
2c1d0 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74  from the right t
2c1e0 61 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76  able bitmask giv
2c1f0 65 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73  es a.  ** bitmas
2c200 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  k for all tables
2c210 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2c220 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69  the join.  Knowi
2c230 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  ng the bitmask. 
2c240 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c   ** for all tabl
2c250 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
2c260 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73  f a left join is
2c270 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63   important.  Tic
2c280 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a  ket #3015..  **.
2c290 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74    ** Configure t
2c2a0 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 76  he WhereClause.v
2c2b0 6d 61 73 6b 20 76 61 72 69 61 62 6c 65 20 73 6f  mask variable so
2c2c0 20 74 68 61 74 20 62 69 74 73 20 74 68 61 74 20   that bits that 
2c2d0 63 6f 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20  correspond.  ** 
2c2e0 74 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  to virtual table
2c2f0 20 63 75 72 73 6f 72 73 20 61 72 65 20 73 65 74   cursors are set
2c300 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
2c310 6f 20 73 65 6c 65 63 74 69 76 65 6c 79 20 64 69  o selectively di
2c320 73 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20  sable .  ** the 
2c330 4f 52 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f  OR-to-IN transfo
2c340 72 6d 61 74 69 6f 6e 20 69 6e 20 65 78 70 72 41  rmation in exprA
2c350 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20  nalyzeOrTerm(). 
2c360 49 74 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75  It is not helpfu
2c370 6c 20 0a 20 20 2a 2a 20 77 69 74 68 20 76 69 72  l .  ** with vir
2c380 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a  tual tables..  *
2c390 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
2c3a0 20 62 69 74 6d 61 73 6b 73 20 61 72 65 20 63 72   bitmasks are cr
2c3b0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 70 54  eated for all pT
2c3c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 74 61 62  abList->nSrc tab
2c3d0 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62  les in.  ** pTab
2c3e0 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74  List, not just t
2c3f0 68 65 20 66 69 72 73 74 20 6e 54 61 62 4c 69 73  he first nTabLis
2c400 74 20 74 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c  t tables.  nTabL
2c410 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ist is normally.
2c420 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 70 54    ** equal to pT
2c430 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 62 75 74  abList->nSrc but
2c440 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
2c450 6e 65 64 20 74 6f 20 31 20 69 66 20 74 68 65 0a  ned to 1 if the.
2c460 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e 45 54 41    ** WHERE_ONETA
2c470 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 73  BLE_ONLY flag is
2c480 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
2c490 65 72 74 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d  ert( pWC->vmask=
2c4a0 3d 30 20 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e  =0 && pMaskSet->
2c4b0 6e 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  n==0 );.  for(i=
2c4c0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
2c4d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
2c4e0 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
2c4f0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2c500 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69 66  i].iCursor);.#if
2c510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c520 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2c530 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
2c540 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
2c550 29 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  ) && IsVirtual(p
2c560 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
2c570 61 62 29 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ab) ){.      pWC
2c580 2d 3e 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74  ->vmask |= ((Bit
2c590 6d 61 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20  mask)1 << i);.  
2c5a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
2c5b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2c5c0 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f  {.    Bitmask to
2c5d0 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  TheLeft = 0;.   
2c5e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2c5f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2c600 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  {.      Bitmask 
2c610 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
2c620 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2c630 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
2c640 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
2c650 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
2c660 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
2c670 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
2c680 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
2c690 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
2c6a0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
2c6b0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
2c6c0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
2c6d0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
2c6e0 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
2c6f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2c700 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
2c710 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
2c720 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
2c730 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
2c740 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
2c750 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
2c760 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
2c770 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
2c780 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
2c790 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
2c7a0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
2c7b0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
2c7c0 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 29 3b  (pTabList, pWC);
2c7d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2c7e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2c7f0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2c800 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ror;.  }..  /* C
2c810 68 65 63 6b 20 69 66 20 74 68 65 20 44 49 53 54  heck if the DIST
2c820 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2c 20  INCT qualifier, 
2c830 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c  if there is one,
2c840 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 0a   is redundant. .
2c850 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2c860 68 65 6e 20 73 65 74 20 70 44 69 73 74 69 6e 63  hen set pDistinc
2c870 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 57 68  t to NULL and Wh
2c880 65 72 65 49 6e 66 6f 2e 65 44 69 73 74 69 6e 63  ereInfo.eDistinc
2c890 74 20 74 6f 0a 20 20 2a 2a 20 57 48 45 52 45 5f  t to.  ** WHERE_
2c8a0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20  DISTINCT_UNIQUE 
2c8b0 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 61 6c 6c  to tell the call
2c8c0 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
2c8d0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a   DISTINCT..  */.
2c8e0 20 20 69 66 28 20 70 44 69 73 74 69 6e 63 74 20    if( pDistinct 
2c8f0 26 26 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  && isDistinctRed
2c900 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70  undant(pParse, p
2c910 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 70 44  TabList, pWC, pD
2c920 69 73 74 69 6e 63 74 29 20 29 7b 0a 20 20 20 20  istinct) ){.    
2c930 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  pDistinct = 0;. 
2c940 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
2c950 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
2c960 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
2c970 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68  }..  /* Chose th
2c980 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20  e best index to 
2c990 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  use for each tab
2c9a0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2c9b0 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
2c9c0 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73   This loop fills
2c9d0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2c9e0 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20  g fields:.  **. 
2c9f0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2ca00 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20  ].pIdx      The 
2ca10 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2ca20 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74   this level of t
2ca30 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20  he loop..  **   
2ca40 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c  pWInfo->a[].wsFl
2ca50 61 67 73 20 20 20 57 48 45 52 45 5f 78 78 78 20  ags   WHERE_xxx 
2ca60 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  flags associated
2ca70 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20   with pIdx.  ** 
2ca80 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45    pWInfo->a[].nE
2ca90 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62  q       The numb
2caa0 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20  er of == and IN 
2cab0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
2cac0 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
2cad0 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68 20 74  From     Which t
2cae0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
2caf0 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
2cb00 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
2cb10 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
2cb20 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2cb30 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
2cb40 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
2cb50 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
2cb60 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
2cb70 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
2cb80 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ndex.  **   pWIn
2cb90 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20  fo->a[].pTerm   
2cba0 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d    When wsFlags==
2cbb0 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c  WO_OR, the OR-cl
2cbc0 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20  ause term.  **. 
2cbd0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
2cbe0 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
2cbf0 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
2cc00 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2cc10 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
2cc20 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
2cc30 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2cc40 30 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  0;.  andFlags = 
2cc50 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
2cc60 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2cc70 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
2cc80 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
2cc90 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
2cca0 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  >a; i<nTabList; 
2ccb0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
2ccc0 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 62 65      WhereCost be
2ccd0 73 74 50 6c 61 6e 3b 20 20 20 20 20 20 20 20 20  stPlan;         
2cce0 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63 69 65 6e  /* Most efficien
2ccf0 74 20 70 6c 61 6e 20 73 65 65 6e 20 73 6f 20 66  t plan seen so f
2cd00 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ar */.    Index 
2cd10 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
2cd20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
2cd30 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
2cd40 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
2cd50 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd70 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2cd80 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
2cd90 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
2cda0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
2cdb0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
2cdc0 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
2cdd0 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
2cde0 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
2cdf0 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
2ce00 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
2ce10 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20 20 20 20  isOptimal;      
2ce20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2ce30 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d 61 6c 2f  tor for optimal/
2ce40 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73 65 61 72  non-optimal sear
2ce50 63 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 55  ch */.    int nU
2ce60 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3b 20 20 20  nconstrained;   
2ce70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ce80 74 61 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49  tables without I
2ce90 4e 44 45 58 45 44 20 42 59 20 2a 2f 0a 20 20 20  NDEXED BY */.   
2cea0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 49 6e 64 65   Bitmask notInde
2ceb0 78 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  xed;         /* 
2cec0 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74  Mask of tables t
2ced0 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  hat cannot use a
2cee0 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20  n index */..    
2cef0 6d 65 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e  memset(&bestPlan
2cf00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74  , 0, sizeof(best
2cf10 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74  Plan));.    best
2cf20 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c  Plan.rCost = SQL
2cf30 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
2cf40 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
2cf50 2a 20 42 65 67 69 6e 20 73 65 61 72 63 68 20 66  * Begin search f
2cf60 6f 72 20 6c 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e  or loop %d ***\n
2cf70 22 2c 20 69 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ", i));..    /* 
2cf80 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2cf90 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e 74 72 69   remaining entri
2cfa0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2cfb0 6c 61 75 73 65 20 74 6f 20 66 69 6e 64 20 74 68  lause to find th
2cfc0 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 6e 65  e.    ** next ne
2cfd0 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68 65 20 6c  sted loop. The l
2cfe0 6f 6f 70 20 74 65 73 74 73 20 61 6c 6c 20 46 52  oop tests all FR
2cff0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65  OM clause entrie
2d000 73 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72 20  s.    ** either 
2d010 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20 0a  once or twice. .
2d020 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2d030 65 20 66 69 72 73 74 20 74 65 73 74 20 69 73 20  e first test is 
2d040 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64  always performed
2d050 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74 77   if there are tw
2d060 6f 20 6f 72 20 6d 6f 72 65 20 65 6e 74 72 69 65  o or more entrie
2d070 73 0a 20 20 20 20 2a 2a 20 72 65 6d 61 69 6e 69  s.    ** remaini
2d080 6e 67 20 61 6e 64 20 6e 65 76 65 72 20 70 65 72  ng and never per
2d090 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20  formed if there 
2d0a0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d  is only one FROM
2d0b0 20 63 6c 61 75 73 65 20 65 6e 74 72 79 0a 20 20   clause entry.  
2d0c0 20 20 2a 2a 20 74 6f 20 63 68 6f 6f 73 65 20 66    ** to choose f
2d0d0 72 6f 6d 2e 20 20 54 68 65 20 66 69 72 73 74 20  rom.  The first 
2d0e0 74 65 73 74 20 6c 6f 6f 6b 73 20 66 6f 72 20 61  test looks for a
2d0f0 6e 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e  n "optimal" scan
2d100 2e 20 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69  .  In.    ** thi
2d110 73 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74  s context an opt
2d120 69 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65  imal scan is one
2d130 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73   that uses the s
2d140 61 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20  ame strategy.   
2d150 20 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65   ** for the give
2d160 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  n FROM clause en
2d170 74 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20  try as would be 
2d180 73 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20  selected if the 
2d190 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72  entry.    ** wer
2d1a0 65 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e  e used as the in
2d1b0 6e 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c  nermost nested l
2d1c0 6f 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  oop.  In other w
2d1d0 6f 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20  ords, a table.  
2d1e0 20 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73    ** is chosen s
2d1f0 75 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73  uch that the cos
2d200 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61  t of running tha
2d210 74 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  t table cannot b
2d220 65 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a  e reduced.    **
2d230 20 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20   by waiting for 
2d240 6f 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20  other tables to 
2d250 72 75 6e 20 66 69 72 73 74 2e 20 20 54 68 69 73  run first.  This
2d260 20 22 6f 70 74 69 6d 61 6c 22 20 74 65 73 74 20   "optimal" test 
2d270 77 6f 72 6b 73 0a 20 20 20 20 2a 2a 20 62 79 20  works.    ** by 
2d280 66 69 72 73 74 20 61 73 73 75 6d 69 6e 67 20 74  first assuming t
2d290 68 61 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  hat the FROM cla
2d2a0 75 73 65 20 69 73 20 6f 6e 20 74 68 65 20 69 6e  use is on the in
2d2b0 6e 65 72 20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e  ner loop and fin
2d2c0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 73 20  ding.    ** its 
2d2d0 71 75 65 72 79 20 70 6c 61 6e 2c 20 74 68 65 6e  query plan, then
2d2e0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
2d2f0 20 69 66 20 74 68 61 74 20 71 75 65 72 79 20 70   if that query p
2d300 6c 61 6e 20 75 73 65 73 20 61 6e 79 0a 20 20 20  lan uses any.   
2d310 20 2a 2a 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   ** other FROM c
2d320 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
2d330 20 61 72 65 20 6e 6f 74 52 65 61 64 79 2e 20 20   are notReady.  
2d340 49 66 20 6e 6f 20 6e 6f 74 52 65 61 64 79 20 74  If no notReady t
2d350 65 72 6d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  erms are.    ** 
2d360 75 73 65 64 20 74 68 65 6e 20 74 68 65 20 22 6f  used then the "o
2d370 70 74 69 6d 61 6c 22 20 71 75 65 72 79 20 70 6c  ptimal" query pl
2d380 61 6e 20 77 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a  an works..    **
2d390 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
2d3a0 74 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 2e  t the WhereCost.
2d3b0 6e 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 66  nRow parameter f
2d3c0 6f 72 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63  or an optimal sc
2d3d0 61 6e 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  an might.    ** 
2d3e0 6e 6f 74 20 62 65 20 61 73 20 73 6d 61 6c 6c 20  not be as small 
2d3f0 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  as it would be i
2d400 66 20 74 68 65 20 74 61 62 6c 65 20 72 65 61 6c  f the table real
2d410 6c 79 20 77 65 72 65 20 74 68 65 20 69 6e 6e 65  ly were the inne
2d420 72 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6a 6f 69  rmost.    ** joi
2d430 6e 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  n.  The nRow val
2d440 75 65 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ue can be reduce
2d450 64 20 62 79 20 57 48 45 52 45 20 63 6c 61 75 73  d by WHERE claus
2d460 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
2d470 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
2d480 20 75 73 65 20 69 6e 64 69 63 65 73 2e 20 20 42   use indices.  B
2d490 75 74 20 74 68 69 73 20 6e 52 6f 77 20 72 65 64  ut this nRow red
2d4a0 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 70 70  uction only happ
2d4b0 65 6e 73 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ens if the.    *
2d4c0 2a 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 69  * table really i
2d4d0 73 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20  s the innermost 
2d4e0 6a 6f 69 6e 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  join.  .    **. 
2d4f0 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
2d500 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
2d510 69 73 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65  is only performe
2d520 64 20 69 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20  d if no optimal 
2d530 73 63 61 6e 0a 20 20 20 20 2a 2a 20 73 74 72 61  scan.    ** stra
2d540 74 65 67 69 65 73 20 77 65 72 65 20 66 6f 75 6e  tegies were foun
2d550 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 69  d by the first i
2d560 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 73  teration. This s
2d570 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 0a  econd iteration.
2d580 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 20 74      ** is used t
2d590 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
2d5a0 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 63 61   lowest cost sca
2d5b0 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20 20 20 20 2a  n overall..    *
2d5c0 2a 0a 20 20 20 20 2a 2a 20 50 72 65 76 69 6f 75  *.    ** Previou
2d5d0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
2d5e0 4c 69 74 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  Lite performed o
2d5f0 6e 6c 79 20 74 68 65 20 73 65 63 6f 6e 64 20 69  nly the second i
2d600 74 65 72 61 74 69 6f 6e 20 2d 0a 20 20 20 20 2a  teration -.    *
2d610 2a 20 74 68 65 20 6e 65 78 74 20 6f 75 74 65 72  * the next outer
2d620 6d 6f 73 74 20 6c 6f 6f 70 20 77 61 73 20 61 6c  most loop was al
2d630 77 61 79 73 20 74 68 61 74 20 77 69 74 68 20 74  ways that with t
2d640 68 65 20 6c 6f 77 65 73 74 20 6f 76 65 72 61 6c  he lowest overal
2d650 6c 0a 20 20 20 20 2a 2a 20 63 6f 73 74 2e 20 48  l.    ** cost. H
2d660 6f 77 65 76 65 72 2c 20 74 68 69 73 20 6d 65 61  owever, this mea
2d670 6e 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  nt that SQLite c
2d680 6f 75 6c 64 20 73 65 6c 65 63 74 20 74 68 65 20  ould select the 
2d690 77 72 6f 6e 67 20 70 6c 61 6e 0a 20 20 20 20 2a  wrong plan.    *
2d6a0 2a 20 66 6f 72 20 73 63 72 69 70 74 73 20 73 75  * for scripts su
2d6b0 63 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch as the follow
2d6c0 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 20 20 0a 20  ing:.    **   . 
2d6d0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
2d6e0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a  ABLE t1(a, b); .
2d6f0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
2d700 54 41 42 4c 45 20 74 32 28 63 2c 20 64 29 3b 0a  TABLE t2(c, d);.
2d710 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2d720 2a 20 46 52 4f 4d 20 74 32 2c 20 74 31 20 57 48  * FROM t2, t1 WH
2d730 45 52 45 20 74 32 2e 72 6f 77 69 64 20 3d 20 74  ERE t2.rowid = t
2d740 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1.a;.    **.    
2d750 2a 2a 20 54 68 65 20 62 65 73 74 20 73 74 72 61  ** The best stra
2d760 74 65 67 79 20 69 73 20 74 6f 20 69 74 65 72 61  tegy is to itera
2d770 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  te through table
2d780 20 74 31 20 66 69 72 73 74 2e 20 48 6f 77 65 76   t1 first. Howev
2d790 65 72 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  er it.    ** is 
2d7a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2d7b0 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 77  determine this w
2d7c0 69 74 68 20 61 20 73 69 6d 70 6c 65 20 67 72 65  ith a simple gre
2d7d0 65 64 79 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  edy algorithm.. 
2d7e0 20 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20     ** Since the 
2d7f0 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72  cost of a linear
2d800 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61   scan through ta
2d810 62 6c 65 20 74 32 20 69 73 20 74 68 65 20 73 61  ble t2 is the sa
2d820 6d 65 20 0a 20 20 20 20 2a 2a 20 61 73 20 74 68  me .    ** as th
2d830 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65  e cost of a line
2d840 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
2d850 74 61 62 6c 65 20 74 31 2c 20 61 20 73 69 6d 70  table t1, a simp
2d860 6c 65 20 67 72 65 65 64 79 20 0a 20 20 20 20 2a  le greedy .    *
2d870 2a 20 61 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20  * algorithm may 
2d880 63 68 6f 6f 73 65 20 74 6f 20 75 73 65 20 74 32  choose to use t2
2d890 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 6c   for the outer l
2d8a0 6f 6f 70 2c 20 77 68 69 63 68 20 69 73 20 61 20  oop, which is a 
2d8b0 6d 75 63 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74  much.    ** cost
2d8c0 6c 69 65 72 20 61 70 70 72 6f 61 63 68 2e 0a 20  lier approach.. 
2d8d0 20 20 20 2a 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e     */.    nUncon
2d8e0 73 74 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20  strained = 0;.  
2d8f0 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 30    notIndexed = 0
2d900 3b 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74 69  ;.    for(isOpti
2d910 6d 61 6c 3d 28 69 46 72 6f 6d 3c 6e 54 61 62 4c  mal=(iFrom<nTabL
2d920 69 73 74 2d 31 29 3b 20 69 73 4f 70 74 69 6d 61  ist-1); isOptima
2d930 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b  l>=0 && bestJ<0;
2d940 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20   isOptimal--){. 
2d950 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
2d960 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2d970 2a 20 4d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  * Mask of tables
2d980 20 6e 6f 74 20 79 65 74 20 72 65 61 64 79 20 2a   not yet ready *
2d990 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 46  /.      for(j=iF
2d9a0 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
2d9b0 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
2d9c0 3c 6e 54 61 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20  <nTabList; j++, 
2d9d0 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pTabItem++){.   
2d9e0 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65       int doNotRe
2d9f0 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75  order;    /* Tru
2da00 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  e if this table 
2da10 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65  should not be re
2da20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
2da30 20 20 20 57 68 65 72 65 43 6f 73 74 20 73 43 6f     WhereCost sCo
2da40 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73 74 20  st;     /* Cost 
2da50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2da60 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d 49 6e   best[Virtual]In
2da70 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  dex() */.       
2da80 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2da90 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52 20 42  rBy;  /* ORDER B
2daa0 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64  Y clause for ind
2dab0 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a  ex to optimize *
2dac0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2dad0 73 74 20 2a 70 44 69 73 74 3b 20 20 20 20 20 2f  st *pDist;     /
2dae0 2a 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  * DISTINCT claus
2daf0 65 20 66 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f  e for index to o
2db00 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a 20 20  ptimize */.  .  
2db10 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64        doNotReord
2db20 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d  er =  (pTabItem-
2db30 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  >jointype & (JT_
2db40 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
2db50 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
2db60 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f 4e 6f  j!=iFrom && doNo
2db70 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
2db80 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 67 65  ;.        m = ge
2db90 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2dba0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2dbb0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2dbc0 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  (m & notReady)==
2dbd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2dbe0 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46  f( j==iFrom ) iF
2dbf0 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  rom++;.         
2dc00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2dc10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 61 73     }.        mas
2dc20 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f  k = (isOptimal ?
2dc30 20 6d 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a   m : notReady);.
2dc40 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
2dc50 20 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f   = ((i==0 && ppO
2dc60 72 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65  rderBy )?*ppOrde
2dc70 72 42 79 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  rBy:0);.        
2dc80 70 44 69 73 74 20 3d 20 28 69 3d 3d 30 20 3f 20  pDist = (i==0 ? 
2dc90 70 44 69 73 74 69 6e 63 74 20 3a 20 30 29 3b 0a  pDistinct : 0);.
2dca0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
2dcb0 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  Item->pIndex==0 
2dcc0 29 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64  ) nUnconstrained
2dcd0 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 57  ++;.  .        W
2dce0 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20  HERETRACE(("=== 
2dcf0 74 72 79 69 6e 67 20 74 61 62 6c 65 20 25 64 20  trying table %d 
2dd00 77 69 74 68 20 69 73 4f 70 74 69 6d 61 6c 3d 25  with isOptimal=%
2dd10 64 20 3d 3d 3d 5c 6e 22 2c 0a 20 20 20 20 20 20  d ===\n",.      
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2dd30 20 69 73 4f 70 74 69 6d 61 6c 29 29 3b 0a 20 20   isOptimal));.  
2dd40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2dd50 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
2dd60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dd70 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2dd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56  .        if( IsV
2dd90 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
2dda0 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
2ddb0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
2ddc0 78 5f 69 6e 66 6f 20 2a 2a 70 70 20 3d 20 26 70  x_info **pp = &p
2ddd0 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78  WInfo->a[j].pIdx
2dde0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2ddf0 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
2de00 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2de10 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f  abItem, mask, no
2de20 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79  tReady, pOrderBy
2de30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2de40 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 43               &sC
2de50 6f 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20  ost, pp);.      
2de60 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
2de70 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2de80 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64      bestBtreeInd
2de90 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  ex(pParse, pWC, 
2dea0 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20  pTabItem, mask, 
2deb0 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72  notReady, pOrder
2dec0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2ded0 20 20 70 44 69 73 74 2c 20 26 73 43 6f 73 74 29    pDist, &sCost)
2dee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2def0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2df00 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e  timal || (sCost.
2df10 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
2df20 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  0 );..        /*
2df30 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42   If an INDEXED B
2df40 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  Y clause is pres
2df50 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 70 6c  ent, then the pl
2df60 61 6e 20 6d 75 73 74 20 75 73 65 20 74 68 61 74  an must use that
2df70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2df80 78 20 69 66 20 69 74 20 75 73 65 73 20 61 6e 79  x if it uses any
2df90 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 20 2a 2f   index at all */
2dfa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dfb0 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65   pTabItem->pInde
2dfc0 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  x==0 .          
2dfd0 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73          || (sCos
2dfe0 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  t.plan.wsFlags &
2dff0 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53   WHERE_NOT_FULLS
2e000 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  CAN)==0.        
2e010 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 43 6f            || sCo
2e020 73 74 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  st.plan.u.pIdx==
2e030 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pTabItem->pIndex
2e040 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
2e050 20 69 73 4f 70 74 69 6d 61 6c 20 26 26 20 28 73   isOptimal && (s
2e060 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Cost.plan.wsFlag
2e070 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55  s & WHERE_NOT_FU
2e080 4c 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20  LLSCAN)==0 ){.  
2e090 20 20 20 20 20 20 20 20 6e 6f 74 49 6e 64 65 78          notIndex
2e0a0 65 64 20 7c 3d 20 6d 3b 0a 20 20 20 20 20 20 20  ed |= m;.       
2e0b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   }..        /* C
2e0c0 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20  onditions under 
2e0d0 77 68 69 63 68 20 74 68 69 73 20 74 61 62 6c 65  which this table
2e0e0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 62 65 73   becomes the bes
2e0f0 74 20 73 6f 20 66 61 72 3a 0a 20 20 20 20 20 20  t so far:.      
2e100 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e110 20 20 28 31 29 20 54 68 65 20 74 61 62 6c 65 20    (1) The table 
2e120 6d 75 73 74 20 6e 6f 74 20 64 65 70 65 6e 64 20  must not depend 
2e130 6f 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  on other tables 
2e140 74 68 61 74 20 68 61 76 65 20 6e 6f 74 0a 20 20  that have not.  
2e150 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 79        **       y
2e160 65 74 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20  et run..        
2e170 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2e180 28 32 29 20 41 20 66 75 6c 6c 2d 74 61 62 6c 65  (2) A full-table
2e190 2d 73 63 61 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f  -scan plan canno
2e1a0 74 20 73 75 70 65 72 63 65 64 65 20 69 6e 64 65  t supercede inde
2e1b0 78 65 64 20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a  xed plan unless.
2e1c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2e1d0 20 74 68 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d   the full-table-
2e1e0 73 63 61 6e 20 69 73 20 61 6e 20 22 6f 70 74 69  scan is an "opti
2e1f0 6d 61 6c 22 20 70 6c 61 6e 20 61 73 20 64 65 66  mal" plan as def
2e200 69 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ined above..    
2e210 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e220 2a 20 20 20 28 33 29 20 41 6c 6c 20 74 61 62 6c  *   (3) All tabl
2e230 65 73 20 68 61 76 65 20 61 6e 20 49 4e 44 45 58  es have an INDEX
2e240 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
2e250 74 68 69 73 20 74 61 62 6c 65 20 6c 61 63 6b 73  this table lacks
2e260 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   an.        **  
2e270 20 20 20 20 20 49 4e 44 45 58 45 44 20 42 59 20       INDEXED BY 
2e280 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73 20 74  clause or this t
2e290 61 62 6c 65 20 75 73 65 73 20 74 68 65 20 73 70  able uses the sp
2e2a0 65 63 69 66 69 63 0a 20 20 20 20 20 20 20 20 2a  ecific.        *
2e2b0 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 73 70  *       index sp
2e2c0 65 63 69 66 69 65 64 20 62 79 20 69 74 73 20 49  ecified by its I
2e2d0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
2e2e0 2e 20 20 54 68 69 73 20 72 75 6c 65 20 65 6e 73  .  This rule ens
2e2f0 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ures.        ** 
2e300 20 20 20 20 20 20 74 68 61 74 20 61 20 62 65 73        that a bes
2e310 74 2d 73 6f 2d 66 61 72 20 69 73 20 61 6c 77 61  t-so-far is alwa
2e320 79 73 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e  ys selected even
2e330 20 69 66 20 61 6e 20 69 6d 70 6f 73 73 69 62 6c   if an impossibl
2e340 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
2e350 20 20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f     combination o
2e360 66 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  f INDEXED BY cla
2e370 75 73 65 73 20 61 72 65 20 67 69 76 65 6e 2e 20  uses are given. 
2e380 20 54 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   The error.     
2e390 20 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c     **       will
2e3a0 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
2e3b0 20 72 65 6c 61 79 65 64 20 62 61 63 6b 20 74 6f   relayed back to
2e3c0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
2e3d0 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20   later..        
2e3e0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 4e 45 56  **       The NEV
2e3f0 45 52 28 29 20 63 6f 6d 65 73 20 61 62 6f 75 74  ER() comes about
2e400 20 62 65 63 61 75 73 65 20 72 75 6c 65 20 28 32   because rule (2
2e410 29 20 61 62 6f 76 65 20 70 72 65 76 65 6e 74 73  ) above prevents
2e420 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2e430 20 20 41 6e 20 69 6e 64 65 78 61 62 6c 65 20 66    An indexable f
2e440 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 20 66  ull-table-scan f
2e450 72 6f 6d 20 72 65 61 63 68 69 6e 67 20 72 75 6c  rom reaching rul
2e460 65 20 28 33 29 2e 0a 20 20 20 20 20 20 20 20 2a  e (3)..        *
2e470 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28  *.        **   (
2e480 34 29 20 54 68 65 20 70 6c 61 6e 20 63 6f 73 74  4) The plan cost
2e490 20 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 20 74   must be lower t
2e4a0 68 61 6e 20 70 72 69 6f 72 20 70 6c 61 6e 73 20  han prior plans 
2e4b0 6f 72 20 65 6c 73 65 20 74 68 65 0a 20 20 20 20  or else the.    
2e4c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63 6f 73      **       cos
2e4d0 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  t must be the sa
2e4e0 6d 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  me and the numbe
2e4f0 72 20 6f 66 20 72 6f 77 73 20 6d 75 73 74 20 62  r of rows must b
2e500 65 20 6c 6f 77 65 72 2e 0a 20 20 20 20 20 20 20  e lower..       
2e510 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2e520 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52  (sCost.used&notR
2e530 65 61 64 79 29 3d 3d 30 20 20 20 20 20 20 20 20  eady)==0        
2e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e550 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
2e560 20 20 20 20 20 26 26 20 28 62 65 73 74 4a 3c 30       && (bestJ<0
2e570 20 7c 7c 20 28 6e 6f 74 49 6e 64 65 78 65 64 26   || (notIndexed&
2e580 6d 29 21 3d 30 20 20 20 20 20 20 20 20 20 20 20  m)!=0           
2e590 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2e5b0 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
2e5c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e5d0 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e5f0 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e   || (sCost.plan.
2e600 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e610 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21 3d 30  NOT_FULLSCAN)!=0
2e620 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
2e630 20 28 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64   (nUnconstrained
2e640 3d 3d 30 20 7c 7c 20 70 54 61 62 49 74 65 6d 2d  ==0 || pTabItem-
2e650 3e 70 49 6e 64 65 78 3d 3d 30 20 20 20 2f 2a 20  >pIndex==0   /* 
2e660 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
2e670 20 20 20 20 20 20 20 7c 7c 20 4e 45 56 45 52 28         || NEVER(
2e680 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2e690 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2e6a0 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 29 0a 20  FULLSCAN)!=0)). 
2e6b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62             && (b
2e6c0 65 73 74 4a 3c 30 20 7c 7c 20 73 43 6f 73 74 2e  estJ<0 || sCost.
2e6d0 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e 72  rCost<bestPlan.r
2e6e0 43 6f 73 74 20 20 20 20 20 20 2f 2a 20 28 34 29  Cost      /* (4)
2e6f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e700 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 72 43      || (sCost.rC
2e710 6f 73 74 3c 3d 62 65 73 74 50 6c 61 6e 2e 72 43  ost<=bestPlan.rC
2e720 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
2e730 20 20 20 20 20 20 26 26 20 73 43 6f 73 74 2e 70        && sCost.p
2e740 6c 61 6e 2e 6e 52 6f 77 3c 62 65 73 74 50 6c 61  lan.nRow<bestPla
2e750 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 0a 20 20  n.plan.nRow)).  
2e760 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2e770 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
2e780 3d 3d 3d 20 74 61 62 6c 65 20 25 64 20 69 73 20  === table %d is 
2e790 62 65 73 74 20 73 6f 20 66 61 72 22 0a 20 20 20  best so far".   
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7b0 20 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25     " with cost=%
2e7c0 67 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22  g and nRow=%g\n"
2e7d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e7e0 20 20 20 20 20 20 20 20 6a 2c 20 73 43 6f 73 74          j, sCost
2e7f0 2e 72 43 6f 73 74 2c 20 73 43 6f 73 74 2e 70 6c  .rCost, sCost.pl
2e800 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20  an.nRow));.     
2e810 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d 20       bestPlan = 
2e820 73 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20  sCost;.         
2e830 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20   bestJ = j;.    
2e840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e850 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  ( doNotReorder )
2e860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2e870 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2e880 28 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20 20  ( bestJ>=0 );.  
2e890 20 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65 61    assert( notRea
2e8a0 64 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d 61  dy & getMask(pMa
2e8b0 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
2e8c0 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f  >a[bestJ].iCurso
2e8d0 72 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45 54  r) );.    WHERET
2e8e0 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
2e8f0 69 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61 62  izer selects tab
2e900 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25  le %d for loop %
2e910 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2e920 20 20 20 22 20 77 69 74 68 20 63 6f 73 74 3d 25     " with cost=%
2e930 67 20 61 6e 64 20 6e 52 6f 77 3d 25 67 5c 6e 22  g and nRow=%g\n"
2e940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e950 20 20 62 65 73 74 4a 2c 20 70 4c 65 76 65 6c 2d    bestJ, pLevel-
2e960 70 57 49 6e 66 6f 2d 3e 61 2c 20 62 65 73 74 50  pWInfo->a, bestP
2e970 6c 61 6e 2e 72 43 6f 73 74 2c 20 62 65 73 74 50  lan.rCost, bestP
2e980 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b  lan.plan.nRow));
2e990 0a 20 20 20 20 2f 2a 20 54 68 65 20 41 4c 57 41  .    /* The ALWA
2e9a0 59 53 28 29 20 74 68 61 74 20 66 6f 6c 6c 6f 77  YS() that follow
2e9b0 73 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 68  s was added to h
2e9c0 75 73 68 20 75 70 20 63 6c 61 6e 67 20 73 63 61  ush up clang sca
2e9d0 6e 2d 62 75 69 6c 64 20 2a 2f 0a 20 20 20 20 69  n-build */.    i
2e9e0 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61  f( (bestPlan.pla
2e9f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2ea00 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 26 26  E_ORDERBY)!=0 &&
2ea10 20 41 4c 57 41 59 53 28 70 70 4f 72 64 65 72 42   ALWAYS(ppOrderB
2ea20 79 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  y) ){.      *ppO
2ea30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2ea40 7d 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 50  }.    if( (bestP
2ea50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2ea60 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
2ea70 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  T)!=0 ){.      a
2ea80 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
2ea90 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
2eaa0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69       pWInfo->eDi
2eab0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
2eac0 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
2ead0 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
2eae0 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e  ags &= bestPlan.
2eaf0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
2eb00 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d    pLevel->plan =
2eb10 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a   bestPlan.plan;.
2eb20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 65      testcase( be
2eb30 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
2eb40 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
2eb50 58 45 44 20 29 3b 0a 20 20 20 20 74 65 73 74 63  XED );.    testc
2eb60 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
2eb70 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2eb80 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b  RE_TEMP_INDEX );
2eb90 0a 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61  .    if( bestPla
2eba0 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  n.plan.wsFlags &
2ebb0 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c   (WHERE_INDEXED|
2ebc0 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2ebd0 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  ) ){.      pLeve
2ebe0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
2ebf0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2ec00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
2ec10 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
2ec20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
2ec30 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
2ec40 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2ec50 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
2ec60 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
2ec70 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75  evel->iFrom = (u
2ec80 38 29 62 65 73 74 4a 3b 0a 20 20 20 20 69 66 28  8)bestJ;.    if(
2ec90 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
2eca0 52 6f 77 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29  Row>=(double)1 )
2ecb0 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
2ecc0 6e 51 75 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65  nQueryLoop *= be
2ecd0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77  stPlan.plan.nRow
2ece0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2ecf0 43 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68  Check that if th
2ed00 65 20 74 61 62 6c 65 20 73 63 61 6e 6e 65 64 20  e table scanned 
2ed10 62 79 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65  by this loop ite
2ed20 72 61 74 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20  ration had an.  
2ed30 20 20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20    ** INDEXED BY 
2ed40 63 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20  clause attached 
2ed50 74 6f 20 69 74 2c 20 74 68 61 74 20 74 68 65 20  to it, that the 
2ed60 6e 61 6d 65 64 20 69 6e 64 65 78 20 69 73 20 62  named index is b
2ed70 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64  eing.    ** used
2ed80 20 66 6f 72 20 74 68 65 20 73 63 61 6e 2e 20 49   for the scan. I
2ed90 66 20 6e 6f 74 2c 20 74 68 65 6e 20 71 75 65 72  f not, then quer
2eda0 79 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61  y compilation ha
2edb0 73 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a  s failed..    **
2edc0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
2edd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  ..    */.    pId
2ede0 78 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  x = pTabList->a[
2edf0 62 65 73 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20  bestJ].pIndex;. 
2ee00 20 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20     if( pIdx ){. 
2ee10 20 20 20 20 20 69 66 28 20 28 62 65 73 74 50 6c       if( (bestPl
2ee20 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  an.plan.wsFlags 
2ee30 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2ee40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2ee50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2ee60 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75  Parse, "cannot u
2ee70 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70  se index: %s", p
2ee80 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
2ee90 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42       goto whereB
2eea0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  eginError;.     
2eeb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2eec0 2f 2a 20 49 66 20 61 6e 20 49 4e 44 45 58 45 44  /* If an INDEXED
2eed0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 75 73   BY clause is us
2eee0 65 64 2c 20 74 68 65 20 62 65 73 74 49 6e 64 65  ed, the bestInde
2eef0 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  x() function is.
2ef00 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
2ef10 6e 74 65 65 64 20 74 6f 20 66 69 6e 64 20 74 68  nteed to find th
2ef20 65 20 69 6e 64 65 78 20 73 70 65 63 69 66 69 65  e index specifie
2ef30 64 20 69 6e 20 74 68 65 20 49 4e 44 45 58 45 44  d in the INDEXED
2ef40 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20   BY clause.     
2ef50 20 20 20 2a 2a 20 69 66 20 69 74 20 66 69 6e 64     ** if it find
2ef60 20 61 6e 20 69 6e 64 65 78 20 61 74 20 61 6c 6c   an index at all
2ef70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
2ef80 65 72 74 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ert( bestPlan.pl
2ef90 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 49 64 78 20  an.u.pIdx==pIdx 
2efa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2efb0 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43  .  }.  WHERETRAC
2efc0 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
2efd0 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
2efe0 22 29 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  "));.  if( pPars
2eff0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
2f000 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2f010 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2f020 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  inError;.  }..  
2f030 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20  /* If the total 
2f040 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63  query only selec
2f050 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ts a single row,
2f060 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20   then the ORDER 
2f070 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  BY.  ** clause i
2f080 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20  s irrelevant..  
2f090 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61  */.  if( (andFla
2f0a0 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
2f0b0 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72  E)!=0 && ppOrder
2f0c0 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64  By ){.    *ppOrd
2f0d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
2f0e0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
2f0f0 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
2f100 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2f110 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
2f120 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
2f130 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
2f140 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
2f150 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
2f160 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54  ropriate..  ** T
2f170 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f  he one-pass algo
2f180 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73  rithm only works
2f190 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   if the WHERE cl
2f1a0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
2f1b0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
2f1c0 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20 61 20  ent to update a 
2f1d0 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f  single row..  */
2f1e0 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74 72  .  assert( (wctr
2f1f0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2f200 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2f210 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c  =0 || pWInfo->nL
2f220 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  evel==1 );.  if(
2f230 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2f240 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2f250 49 52 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64  IRED)!=0 && (and
2f260 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
2f270 49 51 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  IQUE)!=0 ){.    
2f280 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2f290 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
2f2a0 6f 2d 3e 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46  o->a[0].plan.wsF
2f2b0 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
2f2c0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
2f2d0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
2f2e0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
2f2f0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
2f300 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
2f310 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
2f320 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
2f330 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
2f340 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2f350 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
2f360 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
2f370 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
2f380 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2f390 74 6d 61 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66  tmask)0;.  pWInf
2f3a0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f  o->nRowOut = (do
2f3b0 75 62 6c 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d  uble)1;.  for(i=
2f3c0 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
2f3d0 2d 3e 61 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b  ->a; i<nTabList;
2f3e0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
2f3f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2f400 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
2f410 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
2f420 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
2f430 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
2f440 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2f450 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20  able/index */.. 
2f460 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
2f470 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2f480 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70  l->iFrom];.    p
2f490 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2f4a0 70 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  pTab;.    pLevel
2f4b0 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62  ->iTabCur = pTab
2f4c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2f4d0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
2f4e0 75 74 20 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  ut *= pLevel->pl
2f4f0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62  an.nRow;.    iDb
2f500 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
2f510 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
2f520 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2f530 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2f540 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2f550 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
2f560 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2f570 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
2f580 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e  /.    }else.#ifn
2f590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f5a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2f5b0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
2f5c0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2f5d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
2f5e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2f5f0 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
2f600 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2f610 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
2f620 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
2f630 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
2f640 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
2f650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f660 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
2f670 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
2f680 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
2f690 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2f6a0 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
2f6b0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2f6c0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
2f6d0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2f6e0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2f6f0 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43  HERE_OMIT_OPEN_C
2f700 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LOSE)==0 ){.    
2f710 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66    int op = pWInf
2f720 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f  o->okOnePass ? O
2f730 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50  P_OpenWrite : OP
2f740 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
2f750 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
2f760 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
2f770 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
2f780 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
2f790 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61     testcase( pTa
2f7a0 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
2f7b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2f7c0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d  ( pTab->nCol==BM
2f7d0 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  S );.      if( !
2f7e0 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
2f7f0 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c  s && pTab->nCol<
2f800 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20 42  BMS ){.        B
2f810 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49  itmask b = pTabI
2f820 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
2f830 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
2f840 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62  .        for(; b
2f850 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d  ; b=b>>1, n++){}
2f860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f870 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2f880 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f890 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20 20  ntAddr(v)-1, .  
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2f8c0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20  _INT_TO_PTR(n), 
2f8d0 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
2f8e0 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54     assert( n<=pT
2f8f0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
2f900 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2f910 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
2f920 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
2f930 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
2f940 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2f950 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
2f960 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
2f970 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66  TIC_INDEX.    if
2f980 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2f990 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f9a0 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20 29  TEMP_INDEX)!=0 )
2f9b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2f9c0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2f9d0 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61  pParse, pWC, pTa
2f9e0 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
2f9f0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 65   pLevel);.    }e
2fa00 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
2fa10 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2fa20 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2fa30 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
2fa40 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
2fa50 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
2fa60 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b 65  u.pIdx;.      Ke
2fa70 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
2fa80 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
2fa90 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a  o(pParse, pIx);.
2faa0 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 75        int iIdxCu
2fab0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
2fac0 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
2fad0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
2fae0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
2faf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2fb00 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
2fb10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fb20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2fb30 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
2fb40 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  Ix->tnum, iDb,. 
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2fb70 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
2fb80 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 56  ANDOFF);.      V
2fb90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fba0 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  %s", pIx->zName)
2fbb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2fbc0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
2fbd0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
2fbe0 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  );.    notReady 
2fbf0 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d  &= ~getMask(pWC-
2fc00 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >pMaskSet, pTabI
2fc10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2fc20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
2fc30 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2fc40 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2fc50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2fc60 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2fc70 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
2fc80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2fc90 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
2fca0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
2fcb0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
2fcc0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
2fcd0 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
2fce0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
2fcf0 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
2fd00 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
2fd10 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
2fd20 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
2fd30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2fd40 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20  TabList; i++){. 
2fd50 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2fd60 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 65  nfo->a[i];.    e
2fd70 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70 50  xplainOneScan(pP
2fd80 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2fd90 70 4c 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76 65  pLevel, i, pLeve
2fda0 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46  l->iFrom, wctrlF
2fdb0 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52 65  lags);.    notRe
2fdc0 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f  ady = codeOneLoo
2fdd0 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69  pStart(pWInfo, i
2fde0 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e 6f  , wctrlFlags, no
2fdf0 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49  tReady);.    pWI
2fe00 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
2fe10 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2fe20 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
2fe30 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
2fe40 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
2fe50 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
2fe60 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
2fe70 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
2fe80 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
2fe90 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
2fea0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
2feb0 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
2fec0 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
2fed0 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
2fee0 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
2fef0 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
2ff00 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
2ff10 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
2ff20 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
2ff30 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
2ff40 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
2ff50 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
2ff60 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
2ff70 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
2ff80 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
2ff90 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69  0; i<nTabList; i
2ffa0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
2ffb0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
2ffc0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2ffd0 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
2ffe0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
2fff0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
30000 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
30010 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
30020 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
30030 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
30040 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
30050 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
30060 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
30070 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
30080 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30090 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
300a0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
300b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
300c0 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
300d0 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
300e0 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
300f0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29  QPlan], "{}", 2)
30100 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
30110 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
30120 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
30130 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
30140 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
30150 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  z, n);.        n
30160 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
30170 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30180 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
30190 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
301a0 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
301b0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
301c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  sFlags & WHERE_R
301d0 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74  OWID_EQ );.    t
301e0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
301f0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
30200 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
30210 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
30220 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
30230 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
30240 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
30250 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
30260 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
30270 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30280 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20  n], "* ", 2);.  
30290 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b      nQPlan += 2;
302a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
302b0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
302c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
302d0 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  EXED)!=0 ){.    
302e0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
302f0 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c  len30(pLevel->pl
30300 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
30310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
30320 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
30330 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30340 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
30350 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
30360 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
30370 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  n], pLevel->plan
30380 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  .u.pIdx->zName, 
30390 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
303a0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  an += n;.       
303b0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
303c0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
303d0 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
303e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
303f0 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
30400 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
30410 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
30420 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
30430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
30440 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
30450 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30460 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
30470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
30480 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
30490 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
304a0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
304b0 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
304c0 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
304d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
304e0 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
304f0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
30500 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
30510 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
30520 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
30530 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
30540 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
30550 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
30560 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
30570 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
30580 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
30590 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
305a0 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
305b0 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
305c0 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
305d0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
305e0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
305f0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
30600 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
30610 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
30620 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
30630 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
30640 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
30650 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
30660 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
30670 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
30680 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
30690 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
306a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
306b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
306c0 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
306d0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
306e0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
306f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
30700 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
30710 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
30720 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
30730 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
30740 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  abList;.  sqlite
30750 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
30760 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  db;..  /* Genera
30770 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
30780 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
30790 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
307a0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
307b0 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
307c0 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
307d0 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i--){.    pLevel
307e0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
307f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
30800 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30810 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
30820 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
30830 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
30840 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30850 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
30860 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
30870 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
30880 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30890 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
308a0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
308b0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
308c0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
308d0 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20  & WHERE_IN_ABLE 
308e0 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  && pLevel->u.in.
308f0 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  nIn>0 ){.      s
30900 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
30910 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
30920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30930 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30940 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
30950 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70  );.      for(j=p
30960 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c  Level->u.in.nIn,
30970 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e   pIn=&pLevel->u.
30980 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b  in.aInLoop[j-1];
30990 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d   j>0; j--, pIn--
309a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
309b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
309c0 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
309d0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
309e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
309f0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
30a00 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
30a10 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73  nTop);.        s
30a20 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
30a30 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
30a40 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d  nTop-1);.      }
30a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
30a60 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
30a70 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
30a80 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30a90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
30aa0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
30ab0 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
30ac0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
30ad0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
30ae0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
30af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30b00 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
30b10 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
30b20 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
30b30 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30b40 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30b50 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
30b60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65 76          || (pLev
30b70 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
30b80 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
30b90 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
30ba0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
30bb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30bc0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
30bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30be0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30bf0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
30c00 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
30c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30c20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
30c30 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
30c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30c50 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
30c60 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
30c70 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
30c80 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
30c90 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b 0a  p==OP_Return ){.
30ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30cb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30cc0 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e 70  Gosub, pLevel->p
30cd0 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46  1, pLevel->addrF
30ce0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  irst);.      }el
30cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
30d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30d10 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
30d20 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
30d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
30d40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
30d50 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
30d60 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
30d70 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
30d80 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
30d90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30da0 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
30db0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
30dc0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30dd0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
30de0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
30df0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20  /* Close all of 
30e00 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
30e10 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20   were opened by 
30e20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
30e30 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
30e40 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
30e50 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e  ==1 || pWInfo->n
30e60 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74 2d  Level==pTabList-
30e70 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28 69  >nSrc );.  for(i
30e80 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
30e90 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  o->a; i<pWInfo->
30ea0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c 65  nLevel; i++, pLe
30eb0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
30ec0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
30ed0 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
30ee0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
30ef0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
30f00 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
30f10 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
30f20 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
30f30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
30f40 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
30f50 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20  phemeral)==0.   
30f60 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65    && pTab->pSele
30f70 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  ct==0.     && (p
30f80 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
30f90 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f  s & WHERE_OMIT_O
30fa0 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d 30 0a 20 20  PEN_CLOSE)==0.  
30fb0 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 77    ){.      int w
30fc0 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  s = pLevel->plan
30fd0 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  .wsFlags;.      
30fe0 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
30ff0 6e 65 50 61 73 73 20 26 26 20 28 77 73 20 26 20  nePass && (ws & 
31000 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
31010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
31020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
31030 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
31040 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
31050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31060 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
31070 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 28 77  NDEXED)!=0 && (w
31080 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
31090 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NDEX)==0 ){.    
310a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
310b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
310c0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
310d0 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ur);.      }.   
310e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
310f0 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20  is scan uses an 
31100 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65  index, make code
31110 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74   substitutions t
31120 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20  o read data.    
31130 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ** from the inde
31140 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20  x in preference 
31150 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f  to the table. So
31160 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65  metimes, this me
31170 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ans.    ** the t
31180 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20  able need never 
31190 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68  be read from. Th
311a0 69 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61  is is a performa
311b0 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a  nce boost,.    *
311c0 2a 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65  * as the vdbe le
311d0 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20  vel waits until 
311e0 74 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61  the table is rea
311f0 64 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c  d before actuall
31200 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67  y.    ** seeking
31210 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   the table curso
31220 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  r to the record 
31230 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
31240 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
31250 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   ** position in 
31260 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
31270 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
31280 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
31290 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
312a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
312b0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
312c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
312d0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
312e0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
312f0 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
31300 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
31310 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
31320 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
31330 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
31340 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
31350 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
31360 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
31370 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
31380 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
31390 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
313a0 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
313b0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
313c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
313d0 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20 21  INDEXED)!=0 && !
313e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
313f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20  ){.      int k, 
31400 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56  j, last;.      V
31410 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
31420 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
31430 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70  pLevel->plan.u.p
31440 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
31450 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
31460 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
31470 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
31480 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
31490 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
314a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
314b0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
314c0 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
314d0 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
314e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
314f0 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
31500 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
31510 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
31520 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
31530 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
31540 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
31550 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
31560 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
31570 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
31580 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
31590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
315a0 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
315c0 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
315d0 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
315e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
315f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31610 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
31620 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
31630 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
31640 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
31650 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43     || j<pIdx->nC
31660 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
31670 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
31680 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
31690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
316a0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
316b0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
316c0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
316d0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
316e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
316f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
31700 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
31710 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  */.  pParse->nQu
31720 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f  eryLoop = pWInfo
31730 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  ->savedNQueryLoo
31740 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  p;.  whereInfoFr
31750 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
31760 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.